在JS書籍和部落格中常見的一個誤區是:“==檢查值是否相等,===檢查值和型別是否相等”。
正確的解釋是:“==允許在相等比較中進行強制型別轉換,而===不允許”。==和===都會檢查運算元的型別。區別在於運算元型別不同時它們的處理方式不同。
如果進行比較的兩個值型別相同,則==和===使用相同的演算法,所以除了JavaScript引擎實現上的細微差別之外,它們之間並沒有什麼不同。
如果兩個值的型別不同,我們就需要考慮有沒有強制型別轉化的必要,有就用==,沒有就用===,不用在乎效能。
-
如果2個值的型別相同,就僅比較它們是否相等。
特殊情況:NaN不等於NaN +0等於-0
-
物件的寬鬆相等==,兩個物件指向同一個值時,即視為相等,不發生強制型別轉換。
- ==在比較兩個不同型別的值時會發生隱式強制型別轉換,會將其中之一或兩者都轉換為相同的型別後在進行比較。
a) 字串和數字之間的相等比較
如果x是數字,y是字串,則返回x == ToNumber(y)
如果x是字串,y是數字,則返回ToNumber(x) == yb) 其他型別和布林型別之間的相等比較
如果x是布林型別,則返回ToNumber(x) == y
如果y是布林型別,則返回x == ToNumber(y)
建議無論什麼情況下都不要使用 ==true 和 ==falsec) undefined和null之間的相等比較
如果x是null,y是undefined,則結果為true
如果x是undefined,y是null,則結果為true
在==中undefined和null相等(它們也與其自身相等),除此之外其他值都不存在這種情況。也就是說,在==中null和undefined是一回事,可以相互進行隱式強制型別轉換。d) 物件(物件/函式/陣列)和非物件(數字/字串/布林值)之間的相等比較
如果x是基本型別,y是物件,則先把y.toString(),然後在比較e)比較少見的情況
[]==![] //true ![]=>false =>false == []=> true
以下兩個原則可以讓我們有效地避免出錯:
如果兩邊的值中有true或者false,千萬不要使用==
如果兩邊的值中有[]、’’或者0,儘量不要使用==
最好使用===來避免不經意的強制型別轉換。這兩個原則可以讓我們避免幾乎所有強制型別轉換的坑。