为什么[[]] [0] ++可以工作但[] ++会引发运行时异常?

时间:2017-08-26 08:52:47

标签: javascript

为什么第一行在第二行引发run-time exception

时有效

第一行:

[[]][0]++; //this line works fine

第二行:

[]++; //this lines throws exception

3 个答案:

答案 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在很多地方都是纯粹的废话......但不是真的在这里。