P粉3365367062023-08-24 09:01:58
==
運算子(相等)true == 1; //true, because 'true' is converted to 1 and then compared "2" == 2; //true, because "2" is converted to 2 and then compared
===
運算子(Identity)true === 1; //false "2" === 2; //false
這是因為相等運算子 ==
會進行型別強制轉換,這表示解譯器會在比較之前隱式嘗試轉換值。
另一方面,恆等運算子 ===
不會進行型別強制,因此在比較時不會轉換值。
P粉1788942352023-08-24 00:58:02
嚴格相等運算子(===
) 的行為與抽象相等運算子(==
) 相同,只是不進行型別轉換,且型別必須是相同的被認為是平等的。
#==
運算子將在進行任何必要的型別轉換後比較是否相等。 ===
運算子不會進行轉換,因此如果兩個值不是相同類型,===
將簡單地傳回假
。兩者都一樣快。
引用 Douglas Crockford 的精彩內容JavaScript:好的部分一个>,
@Casebash 在評論和@Phillipe Laybaert 的 關於物件的答案。對於對象,==
和 ===
彼此行為一致(特殊情況除外)。
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
建構子從字串文字建立字串物件。
參考
https://262.ecma-international.org/5.1/#sec-11.9 .3