JavaScript中的==運算

LucyGirl發表於2018-05-15

JavaScript中==的運算

今天無意間在開啟掘金時,看到一篇文章:一張圖徹底搞定JavaScript中的==運算,文章的地址:一張圖徹底搞定JavaScript中的==運算

文章中的圖詳細的講解了各種型別之間==的轉換,其中左右型別的==轉換都會趨向於Number型別的轉換

我們知道,JavaScript的資料型別分為兩大類:原始型別(primitive)和物件型別(object)

  • 所有的物件都有valueOf和toString方法,他們都繼承自object物件,可以被子類重寫
  • undefined和null型別只有一個值,即其本身,number的值有很多,String的值理論上有很多

1、當string型別與number型別進行==運算時:
字串會通過ToNumber (Number())操作進行轉換,如果能將字串轉成合理數字,則返回數字,如果不能,則返回NAN;

x == y ---> Number(x) == y;
複製程式碼

字串轉化成數字的規則為:b按字串兩邊的空白符去掉,然後在去掉兩邊的雙引號,看他能否組成合理的數字,可以,則返回這個數字,反之,則返回NAN;

Number("456");   //456
Number("156ABC") //NAN
Number("\r\n\t123\v\f") //123
Number('');     //0
複製程式碼

2、boolean型別與number型別==運算 boolean只有兩個值,為:true和false,其中他們轉換成數字時為:true ---> 1,false ---> 0;

3、boolean型別與string型別==運算
boolean型別的值和string型別的值會分別先轉化成數字型別,再進行比較

4、物件型別與原始型別之間的==運算

[''] == false;
複製程式碼

這是一個物件型別和原始型別布林值之間的==運算,我們先將false轉化成0

[''] == 0;
複製程式碼

下面將物件型別轉換原始型別,其呼叫的過程為:

  • 首先會呼叫物件中的valueOf()方法,由於valueOf()返回的是本身的值,所以它還是物件型別
  • 那麼此時它就會呼叫物件中的toString(),toString方法返回的是一個字串型別,此時它為原始型別,那麼轉化後的值再會轉化成數字型別與之比較,上面的結果會如下:
'' == 0;
0 == 0;  //true
複製程式碼

在要掌握==之間的運算規則,除了理解各型別之間的轉化規則,還要理解valueOf()和toString()的規則。

下面引用文章中的一個圖來做總結吧:

== 運算
圖中P:ToPrimitive N:ToNumber

  • undefined == null 其結果為true,這兩個值與其他的==運算結果為false
  • string/boolean與number的==運算,都會先轉換成number型別,在進行比較
  • string與boolean的==運算,兩者都會先轉化成number型別在比較
  • object型別的==運算,會x先轉化成primitive型別

這篇文章是參考一張圖徹底搞定JavaScript中的==運算而寫的筆記,如果想要更詳細的瞭解或者是更有邏輯的理解,請參考原文: 一張圖徹底搞定JavaScript中的==運算

感謝您的閱讀,希望你有所收穫
這是作者首次寫文章,如有不足,請諒解,並提出你寶貴的意見~~

相關文章