这个表达式(({} + [])[+ []])在JavaScript中意味着什么?

时间:2014-12-28 01:06:24

标签: javascript

现在我遇到了一个奇怪的JavaScript表达式console.log(({}+[])[+[]]),我尝试通过以下测试来理解它。

  1. console.log([])输出[]

  2. console.log(+[])输出0

  3. 所以[+[]]等于[0],我猜它似乎是一个数组。但是,我无法弄清楚整个表达式({}+[])[+[]]是什么意思?

    基于第二个表达式,我认为我们可以获得1。我通过console.log(+!![])完成了这项工作,但当我尝试2 console.log(+!![]++!![])时,它失败了。

    以下是我的想法2 = 1 + 1,因此+!![]++!![]表示(+!![]) + (+!![])。任何人都可以帮我弄清楚它失败的原因吗?

1 个答案:

答案 0 :(得分:2)

这没有任何用处。就像你说的那样,[0]的结果为({}+[])[

  1. ({}+[]) == '[object Object]'因为您要连接两个没有常规添加方式的对象,所以这只会返回括号之间的东西是一个对象,
  2. '[object Object]'[0] == '['因为[0]总是获取字符串的第一个字符(字符串被视为包含单个字母的数组)。
  3. 考虑到问题的第二部分,它不起作用,因为彼此相邻有两个加号,因此它假定您使用后缀增量(如循环中的i++) 。只需在空格之间添加空格即可解决此问题:

    console.log(+!![]+ +!![])
    > 2
    

    但是,既然你无论如何都要添加数组的布尔值,这里是1,你也可以保留前缀+,因为表达式已经将这个布尔值转换为数字:

    console.log(!![] + !![])
    > 2
    

    !!部分只是将后面的内容转换为布尔值。由于!myVar返回与布尔值myVar相反的布尔值,!(!myVar),与!!myVar相同,将返回与此相反的布尔值。在这种情况下,myVar将是您的空数组[]