Javascript 为什么[[]][0]++;工作,但[]和#x2B+;抛出运行时异常?

Javascript 为什么[[]][0]++;工作,但[]和#x2B+;抛出运行时异常?,javascript,Javascript,为什么第一行工作,而第二行抛出运行时异常 第一行: [[]][0]++; //this line works fine 第二行: []++; //this lines throws exception 相当于 var tmp = [[]]; tmp[0] = tmp[0]+1; tmp[0]是一个空数组,它被强制转换为数字0,递增为1 这仅仅是因为[]+看起来有效。它需要一些类型的杂耍,但它到达那里 但是[]+是完全无效的。没有办法让它有意义 [] = []+1; 这里的左边确实是无效的

为什么第一行工作,而第二行抛出运行时异常

第一行:

[[]][0]++; //this line works fine
第二行:

[]++; //this lines throws exception
相当于

var tmp = [[]];
tmp[0] = tmp[0]+1;
tmp[0]
是一个空数组,它被强制转换为数字
0
,递增为
1

这仅仅是因为
[]+
看起来有效。它需要一些类型的杂耍,但它到达那里

但是
[]+
是完全无效的。没有办法让它有意义

[] = []+1;

这里的左边确实是无效的。您不能分配给空数组。

这是一种罕见的情况,在这种情况下,Javascript做了一些实际有意义的事情。考虑

x[3]++; // Valid
3++;    // Not valid
如果这对你来说是有意义的,那么有什么令人惊讶的呢

[[]][0]++; // valid
[]++;      // not valid
[index]
是一个可以指定或递增的“位置”。这就是全部。您可以递增
a[]
这一事实并不意味着您可以递增

荒谬之处在于,您可以使用
[]
作为索引,这意味着将数组转换为空字符串
“”
,然后再转换为数字
0
,但这是众所周知的Javascript荒谬隐式转换问题。这些隐式转换规则是Javascript的一大缺点,例如意味着
1==[1]
或者
[]==false
(![])==false


Javascript在很多地方都是毫无意义的。。。但是这里不是这样。

操作符(或者任何后缀操作符)要求操作数是一个“引用”-也就是一个可以赋值的值<代码>[]是一个文本,因此无法分配给它<代码>[[]][0]是对临时数组元素的有效引用

0++; // not valid, `0` is a literal.
var a = [];
a++; // ok, `a` is assignable

是的,我想很多人都读过Dave的博客:因为Javascript。你为什么不这么想?你能解释为什么第一行应该抛出异常,或者第二行不应该抛出异常时应该做什么吗?@Bergi它们似乎都做了相同的事情:增加一个空数组。他们只是做得不同而已。我希望它们都抛出,因为数组的递增是没有意义的,正如公认的答案所描述的,它实际上就是这样工作的。它们似乎以不同的方式做着完全相同的事情,这也适用于
['''][0]+
[null][0]+
[false][0]+
,因为它们都转换为
0
。这个答案不正确。它与“看起来”无关。只是
++
运算符需要引用,而
[]
(文本)不需要引用。
0++; // not valid, `0` is a literal.
var a = [];
a++; // ok, `a` is assignable