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

(遷移自舊博客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數組和對象的區別

最後,既然說到數組是對象,那麼來看下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個。

相關文章
相關標籤/搜索