摘要:前幾天李老哥秀了一個(gè)中騷操作給我看,即的值是各位也可以看一下臥槽,牛逼啊很好奇,如何得到這個(gè)結(jié)果,莫名其妙就得到了我第一感覺是不可能啊,可是結(jié)果就在那這就要思考了,這個(gè)是什么碼的騷操作計(jì)算得來的數(shù)字結(jié)果還是字符轉(zhuǎn)化,或是別的什么,它是通過什
前幾天李老哥秀了一個(gè)JavaScript中騷操作給我看,即++[[]][+[]]+[+[]]的值是10;
各位也可以看一下
console.log(++[[]][+[]]+[+[]]) 10
臥槽,牛逼??!
很好奇,js如何得到這個(gè)結(jié)果,莫名其妙就得到了10;我第一感覺是不可能啊,可是結(jié)果就在那;這就要思考了,這個(gè)10是什么?ASCII碼的騷操作計(jì)算得來的數(shù)字結(jié)果還是字符轉(zhuǎn)化,或是別的什么,它是通過什么方式得來的,先輸出一下它的類型:
console.log((typeof ++[[]][+[]]+[+[]])) string
看看發(fā)現(xiàn)了什么?!可以走捷徑了,10是一個(gè)字符串,即是說得到是"10",由此想到了什么?沒錯(cuò),就是字符串拼接,再來看看++[[]][+[]]+[+[]]的結(jié)構(gòu)和"10"本身,很明顯10是由++[[]][+[]]和[+[]]拼接的,可以大膽猜測,++[[]][+[]]結(jié)果是1,[+[]]結(jié)果是0,于是:
console.log(++[[]][+[]]) 1 console.log([+[]]) [0]
猜測與結(jié)果雖有出入,卻也沒偏離太遠(yuǎn),問題大概解決一半了:
在JavaScript中,+[]是等于零的,就是說console.log(+[] === 0)得到的是true;
就是說呢,現(xiàn)在問題變成了++[[]][0]+[0]
實(shí)際上,[[]][0]意思是在數(shù)組[[]]中找到第0個(gè)元素,我們找到的會(huì)是[],這有什么意義呢,先跳過,++[[]][0]的結(jié)果為1,這里我們可以忽略[[]][0]把它當(dāng)成任一個(gè)值,因?yàn)橹攸c(diǎn)是++遞增運(yùn)算符,我們知道++任意值意為依次加一,即是+(任意值+1),++[[]][0]可以轉(zhuǎn)為+[]+1(這里需要留意一個(gè)小細(xì)節(jié),就是++遞增運(yùn)算符會(huì)把值返回為Number類型);
所以問題就變成了1+[0],
在js中[0] == "0",
問題就變成了1+"0" === "10";
那么來猜一猜console.log(1+"0" === "10")會(huì)輸出什么?
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/97911.html