JavaScript 有兩種方式判斷兩個(gè)值是否相等。
等于操作符由兩個(gè)等號(hào)組成:==
JavaScript 是弱類型語(yǔ)言,這就意味著,等于操作符會(huì)為了比較兩個(gè)值而進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
"" == "0" // false
0 == "" // true
0 == "0" // true
false == "false" // false
false == "0" // true
false == undefined // false
false == null // false
null == undefined // true
" \t\r\n" == 0 // true
上面的表格展示了強(qiáng)制類型轉(zhuǎn)換,這也是使用 == 被廣泛認(rèn)為是不好編程習(xí)慣的主要原因,
由于它的復(fù)雜轉(zhuǎn)換規(guī)則,會(huì)導(dǎo)致難以跟蹤的問(wèn)題。
此外,強(qiáng)制類型轉(zhuǎn)換也會(huì)帶來(lái)性能消耗,比如一個(gè)字符串為了和一個(gè)數(shù)字進(jìn)行比較,必須事先被強(qiáng)制轉(zhuǎn)換為數(shù)字。
嚴(yán)格等于操作符由三個(gè)等號(hào)組成:===
不像普通的等于操作符,嚴(yán)格等于操作符不會(huì)進(jìn)行強(qiáng)制類型轉(zhuǎn)換。
"" === "0" // false
0 === "" // false
0 === "0" // false
false === "false" // false
false === "0" // false
false === undefined // false
false === null // false
null === undefined // false
" \t\r\n" === 0 // false
上面的結(jié)果更加清晰并有利于代碼的分析。如果兩個(gè)操作數(shù)類型不同就肯定不相等也有助于性能的提升。
雖然 == 和 === 操作符都是等于操作符,但是當(dāng)其中有一個(gè)操作數(shù)為對(duì)象時(shí),行為就不同了。
{} === {}; // false
new String('foo') === 'foo'; // false
new Number(10) === 10; // false
var foo = {};
foo === foo; // true
這里等于操作符比較的不是值是否相等,而是是否屬于同一個(gè)身份;也就是說(shuō),只有對(duì)象的同一個(gè)實(shí)例才被認(rèn)為是相等的。
這有點(diǎn)像 Python 中的 is 和 C 中的指針比較。
注意:為了更直觀的看到
==和===的區(qū)別,可以參見(jiàn)JavaScript Equality Table
強(qiáng)烈推薦使用嚴(yán)格等于操作符。如果類型需要轉(zhuǎn)換,應(yīng)該在比較之前顯式的轉(zhuǎn)換, 而不是使用語(yǔ)言本身復(fù)雜的強(qiáng)制轉(zhuǎn)換規(guī)則。