"=="和"==="運算符用於比較兩個值是否相等,當然它們對相等的定義不盡相同。兩個運算符允許任意類型的操作數,如果操作數相等則返回true,否則返回false。“===”也稱為嚴格相等運算符或恆等運算符(sctrict equality or identity operator),用它來檢測兩個操作數是否嚴格相等。“==”運算符稱作相等運算符(equality operator),用它來檢測兩個操作數是否相等,這里“相等”的定義就非常寬松,可以允許進行類型轉換。
JavaScript支持“=”、“==”、“===”運算符。你應當理解這些(賦值、相等、恆等或絕對相等)運算符直接的區別,並在編碼過程中小心使用。盡管它們都可以稱作“相等”,但為了減少概念混淆,應該把 “=” 稱作 “得到或賦值” ,把 “==” 稱作 “相等” ,把 “===” 稱作 “嚴格相等或絕對相等”。
“!=”和“!==”運算符的檢測規則是“==”和“===”運算符的求反。如果兩個值通過“==”的比較結果為true,那么通過“!=”的比較結果則為false。如果兩值通過“===”的比較結果為true,那么通過“!==”的比較結果則為false。“!=”稱作”不相等“、“!==
”被稱作“不嚴格相等”。
JavaScript對象的比較是引用的比較,而不是值的比較。對象和其本身是相等的,但和其他任何對象都不相等。如果兩個不同的對象具有相同數量的屬性,相同的屬性名和值,它們依然是不相等的。相應位置的數組元素是相等的兩個數組也是不相等的。
嚴格相等運算符“===”首先計算其操作數的值,然后比較這兩個值,比較過程中沒有任何類型轉換:
- 如果兩個值類型不相同,則它們不相等。
- 如果兩個值都是null或者都是undefined,則它們不相等。
- 如果兩個值都是布爾值true或都是布爾值false,則它們不相等。
- 如果其中一個值是NaN,或者兩個值都是NaN,則他們不相等。NaN和其他任何值都是不相等的,包括它本身!通過X!=X來判斷X是否為NaN,只有在X為NaN的時候,這個表達式的值才為true。
- 如果兩個值為數字且數值相等,則它們相等。如果一個值為0,另一個值為-0,則它們同樣相等。
- 如果兩個值為字符串,且所含的對應位上的16位數 完全相等,則它們相等。如果它們的長度或內容不同,則它們不等。兩個字符串可能含義完全一樣且所顯示出的字符也一樣,但具有不同編碼的16位值。javaScript並不對Unicode進行標准化的轉換,因此像這樣的字符串通過“===”和“==”運算符的比較結果也不相等。
- 如果兩個引用值指向同一個對象、數組或函數,則它們是相等的。如果指向不同的對象,則它們是不相等的,盡管兩個對象具有完全一樣的屬性。
相等運算符“==”和恆等運算符相似,但相等運算符的比較並不嚴格。如果兩個操作數不是同一類型,那么相等運算符會嘗試進行一些類型轉換,然后進行比較:
- 如果兩個操作數的類型相同,則和上文所述的嚴格相等的比較規則一樣。如果嚴格相等,那么比較結果為相等。如果它們不嚴格相等,則比較結果為不相等。
- 如果兩個操作數類型不同,“==”相等操作符也可能會認為它們相等。檢測相等將會遵守如下規則和類型轉換:
- 如果一個值是null,另一個是undefined,則它們相等。
- 如果一個值是數字,另一個是字符串,先將字符串轉換為數字然后使用轉換后的值進行比較。
- 如果其中一個值是true,則將其轉換為1再進行比較。如果其中一個值是false,則將其轉換為0再進行比較。
- 如果一個值是對象,另一個值是數字或字符串,先將對象轉換為原始值,然后再進行比較。對象通過toString()方法或者valueOf()方法轉換為原始值。JavaScript語言核心的內置類首先嘗試使用valueOf(),再嘗試使用toString(),除了日期類,日期類只能使用toSring()方法轉換。那些不是JavaScript語言核心中的對象則通過各自的實現種定義的方法轉換為原始值。
- 其他不同類型之間的比較均不相等。
