2013-04-02 77 views
0

我讀這些slides,我發現下面的JavaScript行:JavaScript的數組和對象返回字符串

({} + [])[!![] + !![] + !![]] + (![] + [])[!![] + !![] + !![]] 

如果您在控制檯執行這條線,它將返回「JS」。 修改代碼會使行返回不同的字母。我幾乎可以回到我的名字(缺少的 「n」):

({} + [])[!![] + !![] + !![]] + (![] + {})[!![] + !![] + !![] + !![]] + (![] + {})[![] + !![] ] 

爲什麼出現這種情況?這是如何工作的?幻燈片沒有提供關於它的很多信息。

+0

其他副本:http://stackoverflow.com/q/7202157/218196,http://stackoverflow.com/q/4170978/218196 –

+0

對不起,我不能」 t找到這些答案,因爲我沒有關鍵字作爲參考尋找。 –

+0

我只是搜索'[javascript]「{} + []」''和'[javascript]「!! []」';)(但我知道有類似的問題,所以很簡單)。 –

回答

2
  • {} + []:當+具有數字以外的操作數,它調用兩個操作數toString並連接它們的值。 {}.toString()返回[object Object][].toString()返回這簡直是一個空字符串作爲數組的數組的內容持有什麼:

    ("[object Object]" + "")[!![] + !![] + !![]] + (![] + [])[!![] + !![] + !![]] 
    
    ==> 
    
    "[object Object]"[!![] + !![] + !![]] + (![] + [])[!![] + !![] + !![]] 
    
  • []被轉換成布爾,它返回真。邏輯!!如果其操作數不與undefined,null,0或空字符串""進行比較,則返回true。因此!![]返回true。

    當對布爾值進行算術運算時,將執行積分提升。值truefalse分別換算成10

    "[object Object]"[true + true + true] + (![] + [])[true + true + true] 
    
    ==> 
    
    "[object Object]"[1 + 1 + 1] + (![] + [])[1 + 1 + 1] 
    
    ==> 
    
    "[object Object]"[3] + (![] + [])[3] 
    
  • 下標操作者[n]獲得的陣列狀的結構的(n + 1)-th構件(因爲陣列是0索引)。第一[3]獲得字符串的第四字符與是"j"

    "j" + (![] + [])[3] 
    
  • ![]假(因爲[]是truthy)和[]返回一個空字符串:

    "j" + (false + "")[3] 
    
    ==> 
    
    "j" + "false"[3] 
    
  • 的第四字在"false"是「s」(數組是0索引的)。因此,這解析爲:

    "j" + "s" 
    
    ==> "js" 
    
+0

很好的解釋。最後,它並不複雜,謝謝。 –

1

如果仔細觀察,會發生兩件事情,一種是添加空對象和數組,另一種是索引器。

在JS,{} + []返回0

({} + [])返回 「[對象的對象]」

[] + {}返回 「[對象的對象]」

![] + {}返回 「假[對象的對象]」

(![] + [])返回「假」

另外,由於一切都是類型轉換的,true+true = 2(真正等於1)。 !![]將返回true(布爾),所以!![] + !![] + ![]是一樣的做true + true + true這將等於3

因此,對於這個,你正在評估的東西出來爲字符串,然後在索引這些字符串,以獲得單個字符。您可以選擇「假」和「對象」等字樣。

相關問題