關於++[[]][+[]]+[+[]]

weixin_33807284發表於2018-09-19

前幾天李老哥秀了一個JavaScript中騷操作給我看,即++[[]][+[]]+[+[]]的值是10;
各位也可以看一下

console.log(++[[]][+[]]+[+[]])
10

臥槽,牛逼啊!
很好奇,js如何得到這個結果,莫名其妙就得到了10;我第一感覺是不可能啊,可是結果就在那;這就要思考了,這個10是什麼?ASCII碼的騷操作計算得來的數字結果還是字元轉化,或是別的什麼,它是通過什麼方式得來的,先輸出一下它的型別:

console.log((typeof ++[[]][+[]]+[+[]]))
string

看看發現了什麼?!可以走捷徑了,10是一個字串,即是說得到是'10',由此想到了什麼?沒錯,就是字串拼接,再來看看++[[]][+[]]+[+[]]的結構和'10'本身,很明顯10是由++[[]][+[]][+[]]拼接的,可以大膽猜測,++[[]][+[]]結果是1,[+[]]結果是0,於是:

 console.log(++[[]][+[]])
    1
 console.log([+[]])
    [0]

猜測與結果雖有出入,卻也沒偏離太遠,問題大概解決一半了:
在JavaScript中,+[]是等於零的,就是說console.log(+[] === 0)得到的是true;

就是說呢,現在問題變成了++[[]][0]+[0]
實際上,[[]][0]意思是在陣列[[]]中找到第0個元素,我們找到的會是[],這有什麼意義呢,先跳過,++[[]][0]的結果為1,這裡我們可以忽略[[]][0]把它當成任一個值,因為重點是++遞增運算子,我們知道++任意值意為依次加一,即是+(任意值+1),++[[]][0]可以轉為+[]+1(這裡需要留意一個小細節,就是++遞增運算子會把值返回為Number型別);
所以問題就變成了1+[0]
在js中[0] == '0',
問題就變成了1+'0' === '10';
那麼來猜一猜console.log(1+'0' === '10')會輸出什麼?