1. 程式人生 > >你不知道的JavaScript——嚴格相等和寬鬆相等

你不知道的JavaScript——嚴格相等和寬鬆相等

寬鬆相等(loose equals)== 和嚴格相等(strict equals)=== 都用來判斷兩個值是否“相 等”,但是它們之間有一個很重要的區別,特別是在判斷條件上。 常見的誤區是“== 檢查值是否相等,=== 檢查值和型別是否相等”。聽起來蠻有道理,然而 還不夠準確。

正確的解釋是:“== 允許在相等比較中進行強制型別轉換,而 === 不允許。”

如果進行比較的兩個值型別相同,則 == 和 === 使用相同的演算法,所以除了 JavaScript 引擎 實現上的細微差別之外,它們之間並沒有什麼不同。 如果兩個值的型別不同,我們就需要考慮有沒有強制型別轉換的必要,有就用 ==,沒有就用 ===,不用在乎效能

特別注意:

• NaN 不等於 NaN

• +0 等於 -0(。

1. 字串和數字之間的相等比較

因為沒有強制型別轉換,所以 a === b 為 false,42 和 "42" 不相等。 而 a == b 是寬鬆相等,即如果兩個值的型別不同,則對其中之一或兩者都進行強制型別 轉換。

(1) 如果 Type(x) 是數字,Type(y) 是字串,則返回 x == ToNumber(y) 的結果。 (2) 如果 Type(x) 是字串,Type(y) 是數字,則返回 ToNumber(x) == y 的結果

2. 其他型別和布林型別之間的相等比較

轉換規則如下:

eg:x == y

(1) 如果 Type(x) 是布林型別,則返回 ToNumber(x) == y 的結果;

(2) 如果 Type(y) 是布林型別,則返回 x == ToNumber(y) 的結果。

3. null 和 undefined 之間的相等比較

(1) 如果 x 為 null,y 為 undefined,則結果為 true。

(2) 如果 x 為 undefined,y 為 null,則結果為 true。

4. 物件和非物件之間的相等比較

(1) 如果 Type(x) 是字串或數字,Type(y) 是物件,則返回 x == ToPrimitive(y) 的結果;

(2) 如果 Type(x) 是物件,Type(y) 是字串或數字,則返回 ToPromitive(x) == y 的結果。

• 如果兩邊的值中有 true 或者 false,千萬不要使用 ==。

• 如果兩邊的值中有 []、"" 或者 0,儘量不要使用 ==。