alert(++[[]][+[]]+[+[]]);计算为0?

How is alert(++[[]][+[]]+[+[]]); calculated to 0?

alert怎么样(++[[]][+[]]+[+[]]);计算为0? 这个过程叫什么,以便我可以阅读更多相关信息

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

第 1 步:+[]

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

+[]; // 0

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

returned 值相当于调用 [].toString(),然后将 那个 结果给 Number()[].toString() 将 return 一个空字符串 (''),而 Number('') 将 return 0.

Array.prototype.toString

The Array object overrides the toString method of Object. For Array objects, the toString method joins the array and returns one string containing each array element separated by commas.

Number.

In a non-constructor context (i.e., without the new operator), Number can be used to perform a type conversion.

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

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

第 2 步:[[]][0]

这一步是一个简单的数组成员访问操作:首先定义一个嵌套(空)数组的数组,然后用[0]访问第一个嵌套数组,这只是return s []。所以,如果我们替换表达式的这一部分,我们会得到:

++[] + [0]

第 3 步:++[]

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

1 + [0]

第 4 步:1 + [0]

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

因此,一旦 [0] 被转换为字符串,给予 + 运算符的两个操作数都将被转换为字符串,因为一个操作数 already 一个字符串。如果我们现在用转换后的操作数替换表达式,我们将完成计算表达式的最后一步:

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