警报如何(++ [[]] [+ []] + [+ []]);计算到0?

时间:2017-09-15 05:38:14

标签: javascript pre-increment

警报如何(++ [[]] [+ []] + [+ []]);计算到0? 这个过程叫做什么,以便我可以阅读更多关于这个

的内容

1 个答案:

答案 0 :(得分:4)

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

第1步:+[]

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

+[]; // 0

// This is identical:
Number([]); // 0

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

Array.prototype.toString

  

Array对象会覆盖Object的toString方法。对于Array对象,toString方法连接数组并返回一个字符串,其中包含用逗号分隔的每个数组元素。

Number

  

在非构造函数上下文中(即没有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]运算符的两个操作数都将转换为字符串,因为一个操作数已经一个字符串。如果我们现在用转换的操作数替换表达式,我们将在评估表达式时得到最后一步:

+