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