js註意點:數組比較大小方法及數組與對象的區別
(遷移自舊博客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註意點:數組比較大小方法及數組與對象的區別