JavaScript 怪癖 - 数组递增
JavaScript Quirk - Increment on array
为什么是
++[[]][0] == 1
但是
++[]
抛出一个错误
它们不一样吗?我相信第一个示例在数组上执行 index-read
,因此您可以在数组中获取数组。然后执行增量。如果是这样,为什么我不能做第二个例子?
++
是赋值运算符。它需要一个有效的 left-hand-side 操作数(即使它可以在 ++
的右侧)。
[]
只是一个值,不能分配给它。
[[]][0]
将 计算为 [] 但它是有效的左侧,因为它指向现有数组中的一个元素。这样就可以了。
举一个希望不那么令人困惑的例子:
var a = 1
1++ // throws an error
a++ // works fine
a
中的值是什么并不重要。最坏的情况下,++
将 return NaN,永远不会出错,只要它可以分配结果。
您的示例中唯一 JavaScript 的怪癖是 +[] + 1
计算结果为 1,因为空数组被强制转换为空字符串,然后显式为零(+""
是 0
),然后添加到 1
.
++
运算符总是强制转换为数字,不像 +
会满足 ""
(所以 [] + 1
变成 "" + "1"
)。因此,在分解 ++
时,不要忘记将操作数强制为数字(这在您的示例中并不重要)。
为什么是
++[[]][0] == 1
但是
++[]
抛出一个错误
它们不一样吗?我相信第一个示例在数组上执行 index-read
,因此您可以在数组中获取数组。然后执行增量。如果是这样,为什么我不能做第二个例子?
++
是赋值运算符。它需要一个有效的 left-hand-side 操作数(即使它可以在 ++
的右侧)。
[]
只是一个值,不能分配给它。
[[]][0]
将 计算为 [] 但它是有效的左侧,因为它指向现有数组中的一个元素。这样就可以了。
举一个希望不那么令人困惑的例子:
var a = 1
1++ // throws an error
a++ // works fine
a
中的值是什么并不重要。最坏的情况下,++
将 return NaN,永远不会出错,只要它可以分配结果。
您的示例中唯一 JavaScript 的怪癖是 +[] + 1
计算结果为 1,因为空数组被强制转换为空字符串,然后显式为零(+""
是 0
),然后添加到 1
.
++
运算符总是强制转换为数字,不像 +
会满足 ""
(所以 [] + 1
变成 "" + "1"
)。因此,在分解 ++
时,不要忘记将操作数强制为数字(这在您的示例中并不重要)。