1. 程式人生 > >js註意點:數組比較大小方法及數組與對象的區別

js註意點:數組比較大小方法及數組與對象的區別

不一定 介紹 比較大小 字符串 既然 無序 延伸 asc 索引

(遷移自舊博客2017-04-19)

快速復制數組及數組比較大小方法

首先介紹一下復制數組的方法:

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
var aCopy = arr.slice();
aCopy; // ['A', 'B', 'C', 'D', 'E', 'F', 'G'];

這樣就成功復制數組了,是不是很神奇?
slice()就是對應String的substring()版本,它截取Array的部分元素,然後返回一個新的Array:

var arr = ['A', 'B', 'C', 'D', 'E', 'F', 'G'];
arr.slice(0, 3); // 從索引0開始,到索引3結束,但不包括索引3: ['A', 'B', 'C']
arr.slice(3); // 從索引3開始到結束: ['D', 'E', 'F', 'G']

註意到slice()的起止參數包括開始索引,不包括結束索引。
如果不給slice()傳遞任何參數,它就會從頭到尾截取所有元素。利用這一點,我們可以很容易地復制一個Array。也就是我們第一段程序的原理所在。

然後給出一段代碼:

var arr=[1,2,3];
var copyarr=arr.slice();
console.log(arr===copyarr);

這時你就會想copyarr數組是由arr復制而來的,它們應該相等才對。然而你發現這時瀏覽器返回的是false,它們不相等。這是為什麽呢?
原來,兩個數組比較大小是不能通過==或者===來比較的,無論是相等還是全等都不行,都會返回false。
正確比較方法:要判斷JS中的兩個數組是否相同,需要先將數組轉換為字符串,再作比較。
以下兩行代碼將返回true。

alert([].toString()== [].toString());
alert([].toString()===[].toString());

延伸:如果要比較兩個數組是否具有相同的元素,即兩個數組所有元素都相同,但元素的順序不一定一致。只就需要先將數組進行排序,再比較兩個數組是否相等。看下面兩行代碼:

alert([1,2,3].toString()== [3,2,1].toString());
alert([1,2,3].sort().toString()== [3,2,1].sort().toString());

第一行返回false,第二行返回true。第二行是正確姿勢!

接下來解釋下為什麽兩個數組比較大小是不能通過==或者===來比較的。
因為在js中數組是對象,即使是相同的數組也會有不同的地址,所以返回的是false。

js數組和對象的區別

最後,既然說到數組是對象,那麽來看下js數組和對象的區別。

兩者都可以用來表示數據的集合:比如有一個數組a=[1,2,3,4],還有一個對象a={0:1,1:2,2:3,3:4},然後你運行alert(a[1]),兩種情況下的運行結果是相同的!這就是說,數據集合既可以用數組表示,也可以用對象表示,那麽我到底該用哪一種呢?數組表示有序數據的集合,而對象表示無序數據的集合。如果數據的順序很重要,就用數組,否則就用對象。
數組和對象的另一個區別是,數組的數據沒有”名稱”(name),對象的數據有”名稱”(name)。很多編程語言中,都有一種叫做”關聯數組”(associative array)的東西。這種數組中的數據是有名稱的。
比如在javascript中,可以這樣定義一個對象:

var a={“城市”:”北京”,”面積”:16800,”人口”:1600};

但是,也可以定義成一個關聯數組:

a["城市"]=”北京”;
a["面積"]=16800;
a["人口"]=1600;

其實在Javascript中,關聯數組就是對象,對象就是關聯數組。這一點與php語言完全不同,在php中,關聯數組也是數組。
比如運行下面這段javascript:

var a=[1,2,3,4];
a['foo']=’Hello World’;
alert(a.length);

最後的結果是4,也就是說,數組a的元素個數是4個。
但是,運行同樣內容的php代碼就不一樣了:

< ? php
$a=array(1,2,3,4);
$a["foo"]=”Hello world”;
echo count($a);
? >

最後的結果是5,也就是說,數組a的元素個數是5個。

js註意點:數組比較大小方法及數組與對象的區別