如果我執行的螢火下面的代碼片段安慰它在某種程度上打印surprise!
:的Javascript:比較奇怪的行爲
['surprise!', 'boring'][Number(0=="")]
但是,爲什麼?
UPD
對不起的人,這是一個笑話!傑爾是第一個注意到的人!昨天,我發現了一個字符串ZERO WIDTH SPACE,此後便誘惑了一些樂趣=)
如果我執行的螢火下面的代碼片段安慰它在某種程度上打印surprise!
:的Javascript:比較奇怪的行爲
['surprise!', 'boring'][Number(0=="")]
但是,爲什麼?
UPD
對不起的人,這是一個笑話!傑爾是第一個注意到的人!昨天,我發現了一個字符串ZERO WIDTH SPACE,此後便誘惑了一些樂趣=)
0==""
是false
(因爲你有串)在非打印字符,Number(false)
是0
(按page 34 of the spec ),「驚喜」是數組的第0個索引。
你應該得到更多的選票我的朋友 – Joe
如果Type(x)是數目和類型(y)爲字符串,返回 比較X == ToNumber(Y)的結果。
和
StringNumericLiteral的MV ::: [空]是0
所以0==""
返回0 == ToNumber("")
這是0 == 0
這是真實的。
通過==
轉換規則0==""
是true
ES5 15.7.1.1 Number (value)調用ES5 9.3 toNumbertoNumber(true) === 1
而且["suprize!", "boring"][1]
返回"boring"
這顯然是不正確。
爲什麼它是正確的?由於
"".charCodeAt(0) === 8203
你的字符串是不是空字符串。你的字符串中有一個zero width space。
現在,如果我們回到ES5 11.9.3 ==
operator我們看到
如果語法不能解釋字符串作爲StringNumericLiteral
的擴展這意味着
0==""
0==NaN
false
toNumber(false) === 0
Number(0=="") === 0
["suprize!", "boring"][0] === "suprize!"
['surprise!', 'boring'][Number(0=="")]
將返回 '無聊' becouse代碼:
Number(0=="") //returns true
但你的代碼是diferent,你有一種無形的字符你的文字,這就是爲什麼返回false。
如果您正確編寫代碼將返回true,結果將按boring
預期。
但是,如果複製和粘貼代碼,將返回false,這就是爲什麼你的「」(你可以檢查使用鍵盤或「」。長度)
因此您的代碼將返回false一個char ,那將是0然後返回'驚喜!'
你就是在欺騙人:P
['surprise!', 'boring'][Number(0=="")]
"".length //returns 1 ;)
"" != "" // OH GOD THIS IS TRUE :P
我得到無聊時在控制檯 的console.log跑這([ '!surpeise', '無聊'] [數(0 == 「」)] )
你的意思是'surprize!'對? – Jere
@micha,介意'==',而不是== == – newtover
不,他的螢火蟲識別錯誤並修復它們。 – shift66