引子
眾所周知,用在if條件判斷語句中,js有六種假值:false, null, undefined, '', NAN, 0。先來看幾個例子:
[] === []NaN === NaNNaN == NaN0 == []'' == []'' == {}[] == undefined{} == []null == undefined以上這些判斷結果是什么,大家能否一看就知道結果呢?筆者以前對==和===都只有大概的印象,相信大家也都知道,== 判斷如果兩邊變量的類型不同,會將其先做類型轉換再作判斷,而 === 則不做類型轉換,如果類型不同,就一定返回 false。但是筆者最近看到了一個題目,感覺很有意思,貼出來給大家看看:
var x = 1;var obj = { valueOf: function(){ x = 2; return 0 } }console.log(obj == 0, x)恩,這段代碼輸出的結果是 true, 2,是不是不可思議?還有~
var x = 1;var obj = { valueOf: function(){ return {} }, toString: function(){ return {} } } console.log(obj == 0)這段代碼直接拋出了異常: Uncaught TypeError: Cannot convert object to primitive value。
如果你和我一樣覺得很奇怪,那就繼續往下看吧~
=== 的規則
這個比較簡單,我把規則羅列一下
這里不難發現,復合類型的數據(比如對象、數組、函數等)之間的比較不是比較他們的值是否相等,而是比較他們引用的對象是否一樣,因此也不難明白,為什么 [] === [] 判斷為false了。
比如:

== 探究
看下 == 的規則
看到這里,第六條,我們就可以明白,為什么上面的代碼會輸出意想不到的結果甚至拋出錯誤了。
再來看一題:
if (x == 10) x += 5
根據上面的規則,試想一下,如果我們輸入的x是字符串20,那么x的結果會變成什么樣?沒錯,就是205,而往往這種情況我們的目的是想計算20+5的值。
綜合上面的例子,不難看出,== 的比較看似會比較方便,比如 1 == '1' ,但是會埋下隱患,比如可能對類型做出錯誤的假設。因此大多數人建議我們少用== 而盡量使用 ===,事實上我也推薦如果明確知道類型,還是最好用===。
再舉個簡單的例子:團隊協作中你肯定需要讀別人的代碼。而當你看到==時,要判斷清楚作者的代碼意圖是確實需要轉型,還是無所謂要不要轉型只是隨手寫了,還是不應該轉型但是寫錯了……所花費的腦力和時間比明確的===(加上可能需要的明確轉型)要多得多。這樣一想,===不要好太多。
明白了==的機制,那么判斷這6個假值,就變得容易了。
簡單看看幾個例子,大家看看是真是假~
false == ''false == []0 == []'' == [][] == [][] == {}null == undefinedfalse == undefined總結
可以用一張圖來表達 == 返回true的幾個假值:

一、首先看雙等號前后有沒有NaN,如果存在NaN,一律返回false。
二、再看雙等號前后有沒有布爾,有布爾就將布爾轉換為數字。(false是0,true是1)
三、接著看雙等號前后有沒有字符串, 有三種情況:
后記
我的建議是:如果你的的確確知道你在做什么(了解類型轉換的結果),可以用==;否則還是用===吧。
在網上無意中看到的圖,大家可以參考看看:
==號

===號

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。
新聞熱點
疑難解答