前幾天李老哥秀了一個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')
會輸出什麼?