1. 程式人生 > 實用技巧 >JS === 與 ==

JS === 與 ==

嚴格相等運算子(===)的行為與抽象相等運算子(==)相同,不同之處在於未進行任何型別轉換,並且型別必須相同才能被視為相等。

參考: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

特殊情況是,當您比較一個基元和一個物件時,由於該物件toStringvalueOf方法的原因,該物件的結果等於相同的基元例如,考慮將字串基元與使用String建構函式建立的字串物件進行比較

"abc" == new String("abc")    // true
"abc" === new String("abc")   // false

在這裡,==操作員正在檢查兩個物件的值並返回true,但是===看到它們不是同一型別並返回false哪一個是正確的?這確實取決於您要比較的內容。我的建議是完全繞過該問題,只是不要使用String建構函式從字串文字中建立字串物件。