为什么第一行在第二行引发run-time exception
?
第一行:
[[]][0]++; //this line works fine
第二行:
[]++; //this lines throws exception
答案 0 :(得分:17)
[[]][0]++
相当于
var tmp = [[]];
tmp[0] = tmp[0]+1;
tmp[0]
是一个空数组,其数字为0
,增量为{{1}}。
这仅适用,因为1
看起来有效。它需要一些类型的杂耍,但它到达那里。
但<array>[<index>]++
完全无效。没有办法让它变得有意义。
[]++
这里的左侧确实无效。你不能分配一个空数组。
答案 1 :(得分:10)
++
运算符(或实际上任何后缀运算符)要求操作数是“引用” - 即可以赋值的值。 []
是文字,因此您无法分配。 [[]][0]
是对临时数组元素的有效引用。
0++; // not valid, `0` is a literal.
var a = [];
a++; // ok, `a` is assignable
答案 2 :(得分:4)
这是一个罕见的案例,其中Javascript做了一些实际上有意义的事情。考虑
x[3]++; // Valid
3++; // Not valid
如果这对你有意义,那么令人惊讶的是
[[]][0]++; // valid
[]++; // not valid
<array>[index]
是您可以分配或增加的“地方”。就这样。您可以增加a[<expr>]
这一事实并不意味着您可以增加<expr>
。
荒谬的部分是你可以使用[]
作为索引,它具有将数组转换为空字符串""
然后转换为数字0
的含义,但是这个是一个众所周知的Javascript荒谬隐式转换问题。这些隐式转换规则是Javascript的一大瑕疵,例如暗示1 == [1]
或[]==false
和(![])==false
。
Javascript在很多地方都是纯粹的废话......但不是真的在这里。