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

前幾天李老哥秀了一個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

相關文章
相關標籤/搜索