(遷移自舊博客2017-04-19)javascript
首先介紹一下複製數組的方法:php
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:java
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。第二行是正確姿式!code
接下來解釋下爲何兩個數組比較大小是不能經過==或者===來比較的。
由於在js中數組是對象,即便是相同的數組也會有不一樣的地址,因此返回的是false。對象
最後,既然說到數組是對象,那麼來看下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個。