这是有效的,并在JavaScript中返回字符串“10”(此处有更多示例):

控制台日志(++[[]][+[]]+[+[]])

为什么?这里发生了什么?


当前回答

让我们简单一点:

++[[]][+[]]+[+[]] = "10"

var a = [[]][+[]];
var b = [+[]];

// so a == [] and b == [0]

++a;

// then a == 1 and b is still that array [0]
// when you sum the var a and an array, it will sum b as a string just like that:

1 + "0" = "10"

其他回答

++[ [] ][+[]] === 1+[] === 0++[ [] ][0] === 1[+[]]是[0]

然后我们有一个字符串连接:

1+字符串([0])==10

这一个评估结果相同,但有点小

+!![]+''+(+[])

[]-是在对数组进行加法或减法时转换为0的数组,因此+[]=0![]-计算结果为false,因此!![]计算结果为true+!![]-将true转换为计算结果为true的数值,因此在本例中为1+“”-将空字符串附加到表达式,使数字转换为字符串+[]-计算结果为0

因此其计算结果为

+(true) + '' + (0)
1 + '' + 0
"10"

现在你明白了,试试这个:

_=$=+[],++_+''+$
++[[]][+[]]+[+[]]
             ^^^
             |
             v
++[[]][+[]]+[0]
       ^^^
       |
       v
++[[]][0]+[0]
  ^^^^^^^
  |
  v
++[]+[0]
     ^^^
     |
     v
++[]+"0"
^^^^
|
v
++0+"0"
^^^
|
v
1+"0"
^^^^^
|
v
"10"

+运算符通过.valueOf()强制任何非数字操作数。如果不返回数字,则调用.toString()。

我们可以通过以下方式进行验证:

常量x=[],y=[];x.valueOf=()=>(console.log('x.valueOf()已被调用'),y.valueOf));x.toString=()=>(console.log('x.toString()已被调用'),y.toString(());console.log(`+x->${+x}`);

所以+[]与将“”强制为0相同。

如果任何操作数是字符串,则+连接。

让我们简单一点:

++[[]][+[]]+[+[]] = "10"

var a = [[]][+[]];
var b = [+[]];

// so a == [] and b == [0]

++a;

// then a == 1 and b is still that array [0]
// when you sum the var a and an array, it will sum b as a string just like that:

1 + "0" = "10"

一元加给定字符串转换为数字增量运算符给定的字符串转换并递增1[] == ''. 空字符串+“”或+[]的值为0。++[[]][+[]]+[+[]] = 10 ++[“”][0]+[0]:第一部分给出数组的第零个元素,该元素为空字符串1+0 10