相等與比較
JavaScript 有兩種方式判斷兩個值是否相等。
等於操作符
等於操作符由兩個等號組成:==
JavaScript 是弱類型語言,這就意味著,等於操作符會為了比較兩個值而進行強制類型轉換。
"" == "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
上面的表格展示了強型別轉換,這也是使用 == 被廣泛認為是不好編程習慣的主要原因,
由於它的複雜轉換規則,會導致難以跟蹤的問題。
此外,強制類型轉換也會帶來效能消耗,比如一個字串為了和一個數組進行比較,必須事先被強制轉換為數字。
嚴格等於操作符
嚴格等於操作符由三個等號組成:===
不想普通的等於操作符,嚴格等於操作符不會進行強制類型轉換。
"" === "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
上面的結果更加清晰並有利於代碼的分析。如果兩個運算元類型不同就肯定不相等也有助於效能的提升。
比較對象
雖然 == 和 === 操作符都是等於操作符,但是當其中有一個運算元為對象時,行為就不同了。
{} === {}; // false
new String('foo') === 'foo'; // false
new Number(10) === 10; // false
var foo = {};
foo === foo; // true
這裡等於操作符比較的不是值是否相等,而是是否屬於同一個身份;也就是說,只有對象的同一個執行個體才被認為是相等的。
這有點像 Python 中的 is 和 C 中的指標比較。
結論
強烈推薦使用嚴格等於操作符。如果類型需要轉換,應該在比較之前顯式的轉換,
而不是使用語言本身複雜的強制轉換規則。