我最近看到的一個來源,它看起來像下面的表達式 -如何以下表達式的一塊計算結果爲「10」
++[[]][+[]]+[+[]]
輸入該到Chrome瀏覽器(Windows 7的版本27.0。 1453.94米)控制檯顯示"10"
的結果。
有人可以解釋這裏發生了什麼?
我最近看到的一個來源,它看起來像下面的表達式 -如何以下表達式的一塊計算結果爲「10」
++[[]][+[]]+[+[]]
輸入該到Chrome瀏覽器(Windows 7的版本27.0。 1453.94米)控制檯顯示"10"
的結果。
有人可以解釋這裏發生了什麼?
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
。 (最後因爲小數點分隔符是.
,而不是,
。我不知道如果我的語言環境不同,會發生什麼。)
此表達式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]',但是不知道'1'是怎麼來的...... –
好吧,我看到了欺騙表已經列出'++ [[]] [+ []]'等效於'1',但沒有給出任何解釋........ –
+[]
是從陣列中的數轉換成數,其值爲0。
和+[0]
也是0
所以最終的結果可以推斷出,以(++0) + [0]
這是1+[0]
。
併爲一個數字添加一個數組。它們被轉換成字符串,所以結果實際上是'10'。
您可以登錄typeof(++[[]][+[]]+[+[]])
進行驗證。
我非常想到這一點。只是想知道如何將'[[]] [0]'轉換爲'0'部分。在這個過程中遵循哪種轉換規則? –
@SayemAhmed - 當'++'不能應用於數組時,它可以應用於數組元素。 '[[]]'的第一個元素是'[]';試圖應用'++'來觸發JS將'[]'轉換爲0(就像它使用'+ []'所做的那樣)。 –
好的,我明白你的觀點。我只是發現++運算符的行爲有點難以理解。我不能將它應用到數組,我得到。但是當你將它應用到一個數組元素,並且如果這個元素本身就是一個數組,那麼它會被轉換爲一個基元? ECMA規範是否在某處列出了這種行爲? –