寬鬆相等
又稱一般相等
先將比較值轉換成同型別後比較。接著進行的幾乎和嚴格相等(===)一樣。 寬鬆相等會對稱: A == B 等同 B == A ,無論 A 和 B 是什麼。
MDN 相等比較
1 2 3 4 5 6 7 8 9 10 11
| console.log(1 == '1');
console.log(1 == Number('1'));
console.log(17 == '0x11');
console.log(17 == Number('0x11'));
console.log(true == 'true');
console.log(true == Number('true'));
|
布林與字串
會先轉換為數值
在進行比對
至於 Object 與 Array 如何比對呢?
Array 是屬於 Object 的一種,並且在做寬鬆對比時,會被包裹物件轉換在進行比對
1 2 3
| 10 == [10];
10 == Number([10]);
|
詳細範例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| var num = 0; var obj = new String('0'); var str = '0';
console.log(num == num); console.log(obj == obj); console.log(str == str);
console.log(num == obj); console.log(num == str); console.log(obj == str);
console.log(null == undefined);
console.log(obj == null); console.log(obj == undefined);
|
嚴格相等
嚴格相等比較兩個值,而被比較的兩個值都不會轉換成其他型別
。如果值是不同型別,就會被視為不相等。如果兩值型別相同但不是數字,若值相同,則為相等。此外,如果兩個值皆為數字,只要他們是 NaN 以外的同一值,或者 +0 和 -0,則為相等。
NaN,用來表示某些定義不明確的數學問題的解, 例如:負無窮加正無窮,嚴格比較認為 NaN 不等於任何值,包含他本身。
((x !== x)只有在 x 是 NaN 時會是 true。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| var num = 0; var obj = new String('0'); var str = '0';
console.log(num === num); console.log(obj === obj); console.log(str === str);
console.log(num === obj); console.log(num === str); console.log(obj === str);
console.log(null === undefined);
console.log(obj === null); console.log(obj === undefined);
console.log(+0 === -0); console.log(NaN === NaN); console.log(NaN !== NaN); console.log(null === NaN); console.log(undefined === NaN);
|
實際開發
由上述介紹這兩個相等比較的差異,應該就知道在開發中基本上都會使用嚴格比較
才不會出現問題。
參考資料
六角學院 - JavaScript 核心篇
JavaScript 核心觀念(17)-運算子、型別與文法-寬鬆相等、嚴格相等以及隱含轉型