儘量不要用== ==的比較過程 以 [] == ![] 為例 左邊 [] 是個數組 右邊 ![] 是個表達式,表示對數組取反,需要對數組進行布爾判定,數組是對象所以是true,取反之後為false,所以就相當於比較 == 兩邊數據類型不一樣會將數據轉變成原始類型 ,原始類型有 null 、 unde ...
儘量不要用==
==的比較過程
以 [] == ![] 為例
左邊 [] 是個數組 右邊 ![] 是個表達式,表示對數組取反,需要對數組進行布爾判定,數組是對象所以是true,取反之後為false,所以就相當於比較
== 兩邊數據類型不一樣會將數據轉變成原始類型 ,原始類型有 null 、 undefined 、數字、字元串、布爾值,如果數據轉化成字元串就會優先調用toString(),如果數據轉化成數字就會優先調用valueOf()
所以實際上表達式又變成了
都是原始類型了,但是兩邊的類型不一樣 == 又得把兩邊轉成數字 ' ' 轉成數字是 0 ,false轉成數字也是 0 就變成了 0和0的比較
所以說 == 會讓看上去明顯不相等的兩個表達式 結果為 true ,這顯然是不合理的。而===是嚴格相等就不會出現這種情況。
二者的區別
== 是相等 ===是嚴格相等
== 在比較時,如果兩邊的類型相等則進行 === 比較,不相等則會先轉換成相同類型再進行 === 比較,而===比較時,只要類型不一樣就會返回 false
=== 比較:
1)只要類型不同就一定不相等
2)如果兩個值都是數字並且為同一個值,那麼相等,如果至少一個是NaN,則不相等(判定一個值是否為NaN,只能通過isNaN()來判斷)
3)如果兩個值都是字元串且每個位置的字元都一樣,那麼相等,否則不相等
4)如果兩個值都是true 或者 false 那麼相等
5)如果兩個值都是引用類型並且引用同一個對象,那麼相等
6)如果兩個值都是null或者undefined,那麼相等