JS === 與 ==
阿新 • • 發佈:2020-11-23
嚴格相等運算子(===
)的行為與抽象相等運算子(==
)相同,不同之處在於未進行任何型別轉換,並且型別必須相同才能被視為相等。
參考:Javascript教程:比較運算子
進行任何必要的型別轉換後,==
運算子將比較是否相等。該運營商將不會進行轉換,因此,如果兩個值是不一樣的型別將簡單地返回。兩者都同樣快。===
===
false
引用Douglas Crockford出色的JavaScript:The Good Parts,
JavaScript有兩組相等運算子:
===
和!==
,以及它們的邪惡孿生子==
和!=
。優秀的產品以您期望的方式工作。如果兩個運算元具有相同的型別並具有相同的值,則===
產生true
和!==
產生false
。當運算元是相同型別時,邪惡雙胞胎會做正確的事情,但是如果運算元是不同型別,則它們會試圖強制值。他們所遵循的規則是複雜而難忘的。這些是一些有趣的情況:
'' == '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
傳遞性的缺乏令人震驚。我的建議是不要使用邪惡的雙胞胎。相反,請始終使用
===
和!==
。剛剛顯示的所有比較都是false
由===
操作員進行的。
關於物件的回答中提出了一個很好的觀點。對於物件,==
並===
彼此一致行動(除非在特殊情況下)。
var a = [1,2,3];
var b = [1,2,3];
var c = { x: 1, y: 2 };
var d = { x: 1, y: 2 };
var e = "text";
var f = "te" + "xt";
a == b // false
a === b // false
c == d // false
c === d // false
e == f // true
e === f // true
特殊情況是,當您比較一個基元和一個物件時,由於該物件toString
或valueOf
方法的原因,該物件的結果等於相同的基元。例如,考慮將字串基元與使用String
建構函式建立的字串物件進行比較。
"abc" == new String("abc") // true
"abc" === new String("abc") // false
在這裡,==
操作員正在檢查兩個物件的值並返回true
,但是===
看到它們不是同一型別並返回false
。哪一個是正確的?這確實取決於您要比較的內容。我的建議是完全繞過該問題,只是不要使用String
建構函式從字串文字中建立字串物件。