0 == "" // true
上面這段程式碼是隱式轉換導致的還是因為0等於false,""也等於false所以它們才相等,但我覺得隱式轉換的可能性大,因為使用=== 號就不會出現這種問題。
我的疑問是這樣的它是
0 == 0
還是
false == false
人生最曼妙的风景,竟是内心的淡定与从容!
我跟你講清楚吧,隱式轉換這裡沒人比我更熟悉了。
首先看ECMAScript規範對==轉換的規則:
左邊typeof 0是number型 右邊typeof ""是string型
左邊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等于false也是隐式类型转换的一種。
0
false
隐式类型转换
轉換都是false。
!!0 !!""
當然,具體的比較要看規則
0會隱式轉換為false,嚴格模式下會報錯,建議用===比較
js關於「==」的比較是有規則的,符合你這裡的情況具體來說就是:如果一個值是數字,另一個是字串,先將字串轉換成數字,然後使用轉換後的值進行比較。 所以等號右邊的空字串「」會轉換成數字0,左右就相當了。在js權威指南上有關於==比較轉換規則的詳細介紹
這語句相當於 0 == Number("")
0 == Number("")
對於數字、字串、布林類型這3種類型之間的比較都是先轉換成數字再比較。
我跟你講清楚吧,隱式轉換這裡沒人比我更熟悉了。
首先看ECMAScript規範對==轉換的規則:
依照對應法則,滿足低4條規則,此時會進行conparison x==ToNumber(y)此時0==ToNumber("")
再來看看ECMAScript對ToNumber()的對應規則:
接著往下面找:
看到沒,最後ToNumber("")會轉成+0
最後就成了0==+0,你說等不等?記住隱式轉換最後都會變成兩個數字的比較。
具體對應規則這張圖可以描述:
當然這都是最簡單的,樓主可以試試這幾個:
好了,上面弄不懂的話,可以看看我寫的兩篇文章,要花時間研究才能看得懂。
從 []==![] 為 true 剖析 JavaScript 各種蛋痛的型別轉換
從++[[]][+[]]+[+[]]==10?深入淺出弱型別JS的隱式轉換
弄清楚上面,這些可以拿去練習:
0
等于false
也是隐式类型转换
的一種。轉換都是false。
當然,具體的比較要看規則
0會隱式轉換為false,嚴格模式下會報錯,建議用===比較
js關於「==」的比較是有規則的,符合你這裡的情況具體來說就是:如果一個值是數字,另一個是字串,先將字串轉換成數字,然後使用轉換後的值進行比較。
所以等號右邊的空字串「」會轉換成數字0,左右就相當了。在js權威指南上有關於==比較轉換規則的詳細介紹
0 == "" // true
這語句相當於
0 == Number("")
對於數字、字串、布林類型這3種類型之間的比較都是先轉換成數字再比較。