你真的懂 == 比較嗎

今天面試回來,像往常同樣打開手機,看到QQ羣上有個加羣申請,進羣得回答問題:true == '0',看到有個申請的答案爲false,而後我就自信的點了拒絕。閒着無聊,打開電腦在控制檯上輸入題目,結果爲false,我就很好奇爲何是這樣呢?明明兩邊的值都會爲true啊,爲何會錯呢(被拒絕的童鞋不要怪我)。帶這個這個疑問我翻了下你不知道的javascriptjavascript

javascript中的值分爲兩類:java

  1. 能夠被強制轉化爲false的值
  2. 其餘(能夠被強制轉化爲true的值)

咱們知道能轉換爲false的基本類型有,咱們稱其爲假值:面試

  • undefined
  • null
  • ""
  • 0和NaN
  • false

那麼,上面的值既然能夠轉化爲false,咱們的true == '0'兩邊均可以轉化爲true,那麼爲何不相等呢?spa

咱們先來講下寬鬆相等「==」和「===」。在以往的理解中,個人理解一直是:「==」表示兩個值相等,「===」表死兩個值和類型相等。可是書中說,它們的理解應該說是這樣:「==容許在相等比較中進行強制類型轉化,===不容許」,仍是不太理解,兩種理解有什麼區別嗎?暫時放一放,咱們日後看。。。code

下面摘抄一段樹上寫的區別:ip

根絕第一種解釋,===彷佛比==作的事情更多,由於它還要檢查值的類型,第二種解釋中==的工做量更大一些,由於若是值的類型相同海須要進行強制類型轉化。字符串

若是兩個值的類型不一樣,咱們就須要考慮有沒有強制類型轉化的必要,有就用==,不然用===string

接下來咱們來看幾種比較來加深理解it

  1. 字符串和數字的比較
var a = 4;
var b = "4";
a == b //true
a === b //false
複製代碼

這個結果你們應該都知道,可是 == 比較時,是將兩邊的值所有轉化爲數字呢仍是轉化爲字符串比較呢?未完待續。。。(皮一下:smile:)class

哈哈,開個玩笑,公佈答案:轉化爲數字。依據就是:

ES5規範11.9.3.4-5這樣定義(ToNumber強制轉化爲數字)
(1)若是Type(x)是數字,Type(y)是字符串,則返回x == ToNumber(y)的結果
(2)若是Type(x)是字符串,Type(y)是數字,則返回ToNumber == y的結果

  1. 其餘類型與布爾值比較

我以爲這一塊咱們理解的誤區比較多,也是出錯最多的一塊。

例如:

var a = true;
var b = 4;
a == b //false
複製代碼

以往咱們的理解是:數字4是一個真值(與假值對應),會轉化爲true,從而兩邊相等。哪裏錯了呢?咱們直接來看ES標準

ES5規範11.9.3.6-7這樣定義(ToNumber強制轉化爲數字)
(1)若是Type(x)是布爾值,則返回ToNumber(x) == y的結果
(2)若是Type(y)是布爾值,則返回x == ToNumber(y)的結果

原來比較的時候是將布爾值轉化爲數字,即:

var a = true;
var b = 4;
var c = true;
var d = "12";
a == b ===>  1 == 4  //false
c == d ===> 1 == "12" ===> 1 == 12  //false
複製代碼

這樣是否是清楚多了,因此咱們判斷的時候別用( a == true)這種判斷。注意:若是x,y中存在 null或undefiend,則參考第三點

  1. null和undefined之間的比較

ES5規範11.9.3.2-3這樣定義
(1)若是x爲null,y爲undefined,則返回true
(2)若是x爲undefined,y爲null,則返回true

在 == 中,null和undefined相等,除此以外不存在這種狀況

var a = null;
var b;
a == b  //true
a == false //false
b == false //false
a == 0  //false
b == 0 //false
a == ""  //false
b == ""  //false
複製代碼

今天就寫到這裏,第一次寫文章,若有什麼不對的地方,還望你們指正

相關文章
相關標籤/搜索