Javascript 警报是怎样的(+;+;[[]][+;[]]]+;[+;[]]);计算到0?

Javascript 警报是怎样的(+;+;[[]][+;[]]]+;[+;[]]);计算到0?,javascript,pre-increment,Javascript,Pre Increment,警报(++[[]][+[]]+[+[]]+[+[]])的状态如何;计算到0? 这个过程叫什么,这样我就可以阅读更多关于这个的内容了表达式+[[]][+[]]+[+[]]+[+[]]将实际返回字符串'10'。让我们把它分解一下: 步骤1:+[] 这是一个后跟空数组文字的一元加号运算符。一元加号尝试将其后面的值转换为整数。在这种情况下,值是一个数组: +[]; // 0 // This is identical: Number([]); // 0 返回的值相当于调用[].toString(),然

警报(++[[]][+[]]+[+[]]+[+[]])的状态如何;计算到0?
这个过程叫什么,这样我就可以阅读更多关于这个的内容了表达式
+[[]][+[]]+[+[]]+[+[]]
将实际返回字符串
'10'
。让我们把它分解一下:

步骤1:
+[]

这是一个后跟空数组文字的一元加号运算符。一元加号尝试将其后面的值转换为整数。在这种情况下,值是一个数组:

+[]; // 0

// This is identical:
Number([]); // 0
返回的值相当于调用
[].toString()
,然后将结果提供给
Number()
[].toString()
将返回一个空字符串(
'
),而
Number('')
将返回
0

数组对象重写对象的toString方法。对于数组对象,toString方法加入数组并返回一个字符串,该字符串包含由逗号分隔的每个数组元素

在非构造函数上下文中(即没有
new
运算符),
Number
可用于执行类型转换

因此,当我们将源代码中出现的
+[]
更改为
0
时,我们得到:

++[[]][0] + [0]
步骤2:
[[]][0]

这一步是一个简单的数组成员访问操作:首先定义一个带有一个嵌套(空)数组的数组,然后使用
[0]
访问第一个嵌套数组,它只返回
[]
。因此,如果我们替换表达式的这一部分,我们得到:

++[] + [0]
1 + [0]
步骤3:
+[]

++
运算符首先尝试将
转换为一个数字,然后将该数字递增1。在本例中,将数组转换为数字的过程与步骤1中的
+[]
相同:
[]
首先转换为字符串(
'
,在本例中,因为数组为空),然后转换为数字,该数字再次返回
0
。最后,
0
增加
1
,返回
1
。如果我们替换表达式的这一部分,我们得到:

++[] + [0]
1 + [0]
步骤4:
1+[0]

这是故事中奇怪的部分。考虑到上述信息,您可能希望它计算为整数
1
,但实际上它将计算为字符串
'10'
。这是因为上面示例中的两个步骤用于数组的类型转换(先到字符串,然后到数字)。这两个步骤是必需的,因为数组始终是算术运算符的操作数(即数学计算)。然而,
+
运算符既可以用作算术
+
运算符,也可以用作字符串串联运算符,后者始终具有优先级

因此,只要将
[0]
转换为字符串,赋予
+
运算符的两个操作数都将转换为字符串,因为其中一个操作数已经是字符串。如果现在用转换后的操作数替换表达式,则得到计算表达式的最后一步:

'1' + '0'; // '10'

表达式
+[[]][+[]]+[+[]]
实际上将返回字符串
'10'
。让我们把它分解一下:

步骤1:
+[]

这是一个后跟空数组文字的一元加号运算符。一元加号尝试将其后面的值转换为整数。在这种情况下,值是一个数组:

+[]; // 0

// This is identical:
Number([]); // 0
返回的值相当于调用
[].toString()
,然后将结果提供给
Number()
[].toString()
将返回一个空字符串(
'
),而
Number('')
将返回
0

数组对象重写对象的toString方法。对于数组对象,toString方法加入数组并返回一个字符串,该字符串包含由逗号分隔的每个数组元素

在非构造函数上下文中(即没有
new
运算符),
Number
可用于执行类型转换

因此,当我们将源代码中出现的
+[]
更改为
0
时,我们得到:

++[[]][0] + [0]
步骤2:
[[]][0]

这一步是一个简单的数组成员访问操作:首先定义一个带有一个嵌套(空)数组的数组,然后使用
[0]
访问第一个嵌套数组,它只返回
[]
。因此,如果我们替换表达式的这一部分,我们得到:

++[] + [0]
1 + [0]
步骤3:
+[]

++
运算符首先尝试将
转换为一个数字,然后将该数字递增1。在本例中,将数组转换为数字的过程与步骤1中的
+[]
相同:
[]
首先转换为字符串(
'
,在本例中,因为数组为空),然后转换为数字,该数字再次返回
0
。最后,
0
增加
1
,返回
1
。如果我们替换表达式的这一部分,我们得到:

++[] + [0]
1 + [0]
步骤4:
1+[0]

这是故事中奇怪的部分。考虑到上述信息,您可能希望它计算为整数
1
,但实际上它将计算为字符串
'10'
。这是因为上面示例中的两个步骤用于数组的类型转换(先到字符串,然后到数字)。这两个步骤是必需的,因为数组始终是算术运算符的操作数(即数学计算)。然而,
+
运算符既可以用作算术
+
运算符,也可以用作字符串串联运算符,后者始终具有优先级

因此,只要将
[0]
转换为字符串,赋予
+
运算符的两个操作数都将转换为字符串,因为