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