搜尋

首頁  >  問答  >  主體

關於javascript中==的判斷

0 == "" // true

上面這段程式碼是隱式轉換導致的還是因為0等於false,""也等於false所以它們才相等,但我覺得隱式轉換的可能性大,因為使用=== 號就不會出現這種問題。

我的疑問是這樣的它是

0 == 0

還是

false == false

黄舟黄舟2751 天前641

全部回覆(6)我來回復

  • 黄舟

    黄舟2017-05-19 10:31:55

    我跟你講清楚吧,隱式轉換這裡沒人比我更熟悉了。

    首先看ECMAScript規範對==轉換的規則:

    左邊typeof 0是number型

    右邊typeof ""是string型

    依照對應法則,滿足低4條規則,此時會進行conparison x==ToNumber(y)此時0==ToNumber("")

    再來看看ECMAScript對ToNumber()的對應規則:

    接著往下面找:

    看到沒,最後ToNumber("")會轉成+0

    最後就成了0==+0,你說等不等?記住隱式轉換最後都會變成兩個數字的比較。

    具體對應規則這張圖可以描述:

    當然這都是最簡單的,樓主可以試試這幾個:

    []==![]
    ++[[]][+[]]+[+[]]==10
    console.log(([][[]]+[])[+!![]]+([]+{})[!+[]+!![]])

    好了,上面弄不懂的話,可以看看我寫的兩篇文章,要花時間研究才能看得懂。

    從 []==![] 為 true 剖析 JavaScript 各種蛋痛的型別轉換

    從++[[]][+[]]+[+[]]==10?深入淺出弱型別JS的隱式轉換

    弄清楚上面,這些可以拿去練習:

    1.{}+{}
    
    2.{}+[]
    
    3.[]+{}
    
    4.{}+1
    
    5.({}+1)
    
    6.1+{}
    
    7.[]+1
    
    8.1+[]
    
    9.1-[]
    
    10.1-{}
    
    11.1-!{}
    
    12.1+!{}
    
    13.1+"2"+"2"
    
    14.1+ +"2"+"2"
    
    15.1++"2"+"2"
    
    16.[]==![]
    
    17.[]===![]

    回覆
    0
  • 怪我咯

    怪我咯2017-05-19 10:31:55

    0等于false也是隐式类型转换的一種。

    回覆
    0
  • 大家讲道理

    大家讲道理2017-05-19 10:31:55

    轉換都是false。

    !!0
    !!""
    

    當然,具體的比較要看規則

    回覆
    0
  • 怪我咯

    怪我咯2017-05-19 10:31:55

    0會隱式轉換為false,嚴格模式下會報錯,建議用===比較

    回覆
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-19 10:31:55

    js關於「==」的比較是有規則的,符合你這裡的情況具體來說就是:如果一個值是數字,另一個是字串,先將字串轉換成數字,然後使用轉換後的值進行比較。
    所以等號右邊的空字串「」會轉換成數字0,左右就相當了。在js權威指南上有關於==比較轉換規則的詳細介紹

    回覆
    0
  • 怪我咯

    怪我咯2017-05-19 10:31:55

    0 == "" // true

    這語句相當於 0 == Number("")

    對於數字、字串、布林類型這3種類型之間的比較都是先轉換成數字再比較。

    回覆
    0
  • 取消回覆