2012-01-19 83 views
5

如果我執行的螢火下面的代碼片段安慰它在某種程度上打印surprise!的Javascript:比較奇怪的行爲

['surprise!', 'boring'][Number(0=="​")] 

但是,爲什麼?

UPD

對不起的人,這是一個笑話!傑爾是第一個注意到的人!昨天,我發現了一個字符串ZERO WIDTH SPACE,此後便誘惑了一些樂趣=)

+0

你的意思是'surprize!'對? – Jere

+0

@micha,介意'==',而不是== == – newtover

+0

不,他的螢火蟲識別錯誤並修復它們。 – shift66

回答

9

您的報價之間有一個額外的不可見字符。

如果輸入了這一點,你會得到「無聊」,因爲0 ==「」計算結果爲真,編號是(true)演算值爲1

粘貼這兩個,看不同的輸出:

0=="​" 

輸出

0=="" 

輸出

我唯一改變的是刪除""之間的字符。

+0

+1。有一會兒,我以爲控制檯被竊聽了。太好了! – cheeken

+0

什麼作弊... – Raynos

+1

是的,傑爾是對的。複製和粘貼線,然後用鍵盤箭頭移動,你會發現一個額外的停止。這可能是非常小的空間 – welldan97

8

0=="​"false因爲你有串)在非打印字符,Number(false)0(按page 34 of the spec ),「驚喜」是數組的第0個索引。

+0

你應該得到更多的選票我的朋友 – Joe

4

ES5 11.9.3 The == operator

如果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!"
1

['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 
0

我得到無聊時在控制檯 的console.log跑這([ '!surpeise', '無聊'] [數(0 == 「」)] )