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
.
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.
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'
alert怎么样(++[[]][+[]]+[+[]]);计算为0? 这个过程叫什么,以便我可以阅读更多相关信息
表达式++[[]][+[]]+[+[]]
实际上return字符串'10'
。让我们分解一下:
第 1 步:+[]
这是一个一元加运算符,后跟一个空数组文字。一元加号试图将其后的值转换为整数。在这种情况下,该值是一个数组:
+[]; // 0
// This is identical:
Number([]); // 0
returned 值相当于调用 [].toString()
,然后将 那个 结果给 Number()
。 [].toString()
将 return 一个空字符串 (''
),而 Number('')
将 return 0
.
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.
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'