0 == "" // true
上面這段程式碼是隱式轉換導致的還是因為0等於false,""也等於false所以它們才相等,但我覺得隱式轉換的可能性大,因為使用=== 號就不會出現這種問題。
我的疑問是這樣的它是
0 == 0
還是
false == false
黄舟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.[]===![]
给我你的怀抱2017-05-19 10:31:55
js關於「==」的比較是有規則的,符合你這裡的情況具體來說就是:如果一個值是數字,另一個是字串,先將字串轉換成數字,然後使用轉換後的值進行比較。
所以等號右邊的空字串「」會轉換成數字0,左右就相當了。在js權威指南上有關於==比較轉換規則的詳細介紹