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