2013-05-31 71 views

回答

4

JavaScript在數據類型之間轉換相當靈活。首先要注意的事情是,+[]計算結果爲0。*這讓我們重寫表達式:

++[[]][0] + [0] 

下一個要注意的是,++[[]][0]是前增量操作應用於[[]]的第一要素。通常,您不能將++應用於數組,但JavaScript將第一個元素轉換爲0,因此結果爲++[[]][0]的計算結果爲1[[]]的第一個元素現在已經增加)。這是一種像這樣:

var a = [[]]; 
var b = ++a[0]; 
// now a will be [1] and b will be 1 

這使得我們有:

1 + [0] 

的JavaScript現在轉換int和數組的字符串(因爲[0]不是一個數值),並連接在一起。完成!

*我的如何+[]變得0理解的是,它是一個兩步驟的過程:首先,[]被轉換爲字符串原始的,這是空字符串。空字符串然後轉換爲數字,它是零。通過相同的路線,[1]評價爲'1',然後評價爲1[2]評價爲2等但是,[1, 2]評估爲'1,2',其評估爲NaN。 (最後因爲小數點分隔符是.,而不是,。我不知道如果我的語言環境不同,會發生什麼。)

+0

我非常想到這一點。只是想知道如何將'[[]] [0]'轉換爲'0'部分。在這個過程中遵循哪種轉換規則? –

+1

@SayemAhmed - 當'++'不能應用於數組時,它可以應用於數組元素。 '[[]]'的第一個元素是'[]';試圖應用'++'來觸發JS將'[]'轉換爲0(就像它使用'+ []'所做的那樣)。 –

+0

好的,我明白你的觀點。我只是發現++運算符的行爲有點難以理解。我不能將它應用到數組,我得到。但是當你將它應用到一個數組元素,並且如果這個元素本身就是一個數組,那麼它會被轉換爲一個基元? ECMA規範是否在某處列出了這種行爲? –

2

此表達式stringifies有效的Javascript構造一個yelds NaN,數字,布爾undefined

例如

+[] -> 0 //The unary plus operator is applied to the result of toString applied to an empty array (which is an empty string) 

!+[] -> true 

你可以看看還在this question, 並在no alnum cheat sheets

+0

我想出了那部分。我把表達式減少到'++ [[]] [0] + [0]',但是不知道'1'是怎麼來的...... –

+0

好吧,我看到了欺騙表已經列出'++ [[]] [+ []]'等效於'1',但沒有給出任何解釋........ –

2

+[]是從陣列中的數轉換成數,其值爲0。

+[0]也是0

所以最終的結果可以推斷出,以(++0) + [0]這是1+[0]

併爲一個數字添加一個數組。它們被轉換成字符串,所以結果實際上是'10'。

您可以登錄typeof(++[[]][+[]]+[+[]])進行驗證。

相關問題