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個。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM