不要使用 == 比較數(shù)組
JavaScript 中的數(shù)組與其它編程語(yǔ)言的不同,不應(yīng)該使用 == 運(yùn)算符比較 JavaScript 中的數(shù)組。
該運(yùn)算符不會(huì)對(duì)數(shù)組進(jìn)行特殊處理,它會(huì)像處理任意對(duì)象那樣處理數(shù)組。
讓我們回顧一下規(guī)則:
僅當(dāng)兩個(gè)對(duì)象引用的是同一個(gè)對(duì)象時(shí),它們才相等 ==。
如果 == 左右兩個(gè)參數(shù)之中有一個(gè)參數(shù)時(shí)對(duì)象,另一個(gè)參數(shù)是原始類型,那么該對(duì)象將會(huì)被轉(zhuǎn)換為原始類型,轉(zhuǎn)換規(guī)則如?對(duì)象——原始值轉(zhuǎn)換?一章所述。
null 和 undefined 相等 == ,且各自不等于任何其他的值。
嚴(yán)格比較 === 更簡(jiǎn)單,因?yàn)樗粫?huì)進(jìn)行類型轉(zhuǎn)換。
所以,如果我們使用 == 來(lái)比較數(shù)組,除非我們比較的是兩個(gè)引用同一數(shù)組的變量,否則它們永遠(yuǎn)不相等。
例如:
alert( [] == []);? ? //false
alert([0] == [0]);? ? //false
從技術(shù)上講,這些數(shù)組是不同的對(duì)象。所以它們不相等。 == 運(yùn)算符不會(huì)進(jìn)行逐項(xiàng)比較。
與原始類型的比較也可能會(huì)產(chǎn)生看似很奇怪的結(jié)果:
alert(0 == []);? ? //true
alert('0' == []);? ? //false
在這里兩個(gè)例子中,我們將原始類型和數(shù)組對(duì)象進(jìn)行比較。因此,數(shù)組 [] 被轉(zhuǎn)換為原始類型以進(jìn)行比較,被轉(zhuǎn)換成了一個(gè)空字符串 ‘’。
然后,接下來(lái)的比較就是原始類型之間的比較,如?類型轉(zhuǎn)換?一章所述:
//在 [] 被轉(zhuǎn)換為 ‘’ 后
alert(0 == '');? ? //true,因?yàn)?‘’ 被轉(zhuǎn)換成了數(shù)字 0
alert('0' == '');? ? //flase,沒(méi)有進(jìn)一步的類型轉(zhuǎn)換,是不同的字符串
那么,我們應(yīng)該如何對(duì)數(shù)組進(jìn)行比較呢?
很簡(jiǎn)單,不要使用 == 運(yùn)算符。而是,可以在循環(huán)中或者下一章中我們將介紹迭代方法逐項(xiàng)地比較它們。