现在我遇到了一个奇怪的JavaScript表达式console.log(({}+[])[+[]])
,我尝试通过以下测试来理解它。
console.log([])
输出[]
console.log(+[])
输出0
所以[+[]]
等于[0]
,我猜它似乎是一个数组。但是,我无法弄清楚整个表达式({}+[])[+[]]
是什么意思?
基于第二个表达式,我认为我们可以获得1
。我通过console.log(+!![])
完成了这项工作,但当我尝试2
console.log(+!![]++!![])
时,它失败了。
以下是我的想法2 = 1 + 1
,因此+!![]++!![]
表示(+!![]) + (+!![])
。任何人都可以帮我弄清楚它失败的原因吗?
答案 0 :(得分:2)
这没有任何用处。就像你说的那样,[0]
的结果为({}+[])
,[
:
({}+[]) == '[object Object]'
因为您要连接两个没有常规添加方式的对象,所以这只会返回括号之间的东西是一个对象,'[object Object]'[0] == '['
因为[0]
总是获取字符串的第一个字符(字符串被视为包含单个字母的数组)。考虑到问题的第二部分,它不起作用,因为彼此相邻有两个加号,因此它假定您使用后缀增量(如循环中的i++
) 。只需在空格之间添加空格即可解决此问题:
console.log(+!![]+ +!![])
> 2
但是,既然你无论如何都要添加数组的布尔值,这里是1,你也可以保留前缀+
,因为表达式已经将这个布尔值转换为数字:
console.log(!![] + !![])
> 2
!!
部分只是将后面的内容转换为布尔值。由于!myVar
返回与布尔值myVar
相反的布尔值,!(!myVar)
,与!!myVar
相同,将返回与此相反的布尔值。在这种情况下,myVar
将是您的空数组[]
。