前幾天李老哥秀了一個JavaScript中騷操做給我看,即++[[]][+[]]+[+[]]的值是10;
各位也能夠看一下數組
console.log(++[[]][+[]]+[+[]]) 10
臥槽,牛逼啊!
很好奇,js如何獲得這個結果,莫名其妙就獲得了10;我第一感受是不可能啊,但是結果就在那;這就要思考了,這個10是什麼?ASCII碼的騷操做計算得來的數字結果仍是字符轉化,或是別的什麼,它是經過什麼方式得來的,先輸出一下它的類型:code
console.log((typeof ++[[]][+[]]+[+[]])) string
看看發現了什麼?!能夠走捷徑了,10是一個字符串,便是說獲得是'10',由此想到了什麼?沒錯,就是字符串拼接,再來看看++[[]][+[]]+[+[]]
的結構和'10'自己,很明顯10是由++[[]][+[]]
和[+[]]
拼接的,能夠大膽猜想,++[[]][+[]]
結果是1,[+[]]
結果是0,因而:ip
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')
會輸出什麼?string