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

javascript pre-increment

57 观看

1回复

55 作者的声誉

警报如何(++ [[]] [+ []] + [+ []]); 计算为0?这个过程叫什么,以便我可以阅读更多有关此过程的信息

作者: Deepika Rao 的来源 发布者: 2017 年 9 月 15 日

回应 1


4

3518 作者的声誉

决定

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

第1步: +[]

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

+[]; // 0

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

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

Array.prototype.toString

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

编号

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

因此,当我们在源中更改+[]to 0的出现时,我们得到:

++[[]][0] + [0]

第2步: [[]][0]

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

++[] + [0]

第三步: ++[]

所述++ <value>操作者首先试图转换<value>到一个号码,然后通过递增1该号码的步骤与所述阵列转换成数在本例中出现的相同方式+[]在步骤1:[]首先被转换为一个字符串(''在这种情况下,因为数组为空),然后将其转换为数字,然后再次返回0。最后,0由递增1,返回1。因此,如果我们替换表达式的这一部分,则会得到:

1 + [0]

第四步: 1 + [0]

这是故事的一部分。1给定上面的信息,您希望它的计算结果为整数,但实际上,它的计算结果为字符串'10'。这是因为上面的示例中有2个步骤用于数组的类型转换(首先转换为字符串,然后转换为数字)。这两个步骤是必需的,因为数组始终是算术运算符 (即数学计算)的操作数。该+运营商然而,既可以作为一个算术+运算符或字符串连接操作,而后者始终优先。

因此,一旦[0]转换为字符串,赋予+操作符的两个操作数都将转换为字符串,因为一个操作数已经是字符串。如果现在用转换后的操作数替换表达式,我们将获得评估表达式的最后一步:

'1' + '0'; // '10'
作者: Jeffrey Westerkamp 发布者: 2017 年 9 月 15 日
32x32