警报如何(++ [[]] [+ []] + [+ []]);计算到0? 这个过程叫做什么,以便我可以阅读更多关于这个
的内容答案 0 :(得分:4)
表达式++[[]][+[]]+[+[]]
实际上将返回字符串'10'
。让我们分解一下:
第1步:+[]
这是一个一元加运算符,后跟一个空数组文字。一元加号尝试将其后面的值转换为整数。在这种情况下,值是一个数组:
+[]; // 0
// This is identical:
Number([]); // 0
返回的值相当于调用[].toString()
,然后将 结果提供给Number()
。 [].toString()
将返回一个空字符串(''
),Number('')
将返回0
。
Array对象会覆盖Object的toString方法。对于Array对象,toString方法连接数组并返回一个字符串,其中包含用逗号分隔的每个数组元素。
在非构造函数上下文中(即没有
new
运算符),Number
可用于执行类型转换。
因此,当我们在源中更改+[]
到0
的出现时,我们得到:
++[[]][0] + [0]
第2步:[[]][0]
此步骤是一个简单的数组成员访问操作:首先定义一个带有一个嵌套(空)数组的数组,然后使用[0]
访问第一个嵌套数组,它只返回[]
。所以,如果我们替换表达式的这一部分,我们得到:
++[] + [0]
第3步:++[]
++ <value>
运算符首先尝试将<value>
转换为数字,然后将该数字增加1.在此示例中将数组转换为数字的过程与{1}在步骤1中的方式相同:+[]
首先转换为字符串(在这种情况下为[]
,因为数组为空),然后转换为数字,它再次返回''
。最后,0
增加0
,返回1
。因此,如果我们替换表达式的这一部分,我们得到:
1
第4步:1 + [0]
这是故事的奇怪部分。根据上面的信息,您可能希望将此值计算为整数1 + [0]
,但实际上它将计算为字符串1
。这是因为上面示例中的两个步骤用于数组的类型转换(首先是字符串,然后是数字)。这两个步骤是必需的,因为数组总是算术运算符的操作数(即数学计算)。但'10'
运算符既可以作为算术+
运算符,也可以作为字符串连接运算符,后者始终具有优先权。
因此,只要将+
转换为字符串,赋予[0]
运算符的两个操作数都将转换为字符串,因为一个操作数已经一个字符串。如果我们现在用转换的操作数替换表达式,我们将在评估表达式时得到最后一步:
+