为什么 [][[]] 评估为未定义?

Why does [][[]] evaluate to undefined?

表达式 [][[]] 在 JavaScript 中的计算结果为 undefined。我对此的理解是,编译器看到第二组 [...] 并将其解释为数组下标运算符(因为你不能让两个数组彼此相邻)。

因此编译器知道内部表达式 [] 必须是一个索引,因此在对其求值后,将其强制转换为一个数字。 Number([]) 的计算结果为 0,因此我们有 [][0],即 undefined

然而,[1][[]] 并没有像我预期的那样评估为 1,而是评估为 undefined,这表明在这种情况下(或者可能在之前的情况下),[] 不是 被强制转换成一个数字。看来我必须使用一元 + 来强制类型转换:

[1][+[]] // returns 1

所以 如果 表达式 [][[]] 中的内部 [] 没有被强制转换为数字,那么为什么该表达式的计算结果为 undefined?

您正在尝试使用 object.property.property 获取数据,因此对象具有属性,是的,但是属性没有属性,所以它未定义。这么想;

let myArray = [1, 2, 3];
console.log(myArray['length']);
// -> 3
console.log(myArray['length']['length']);
// -> undefined

我觉得有问题, [][[]] 这些括号不会影响代码。尝试用一些代码得到结果;

let myArray = [[[1, 2, 3], 2, 3], 2, 3];
console.log(myArray[0][[0]]);
// -> [1, 2, 3]
console.log(myArray[0][0]);
// -> [1, 2, 3]

错误的假设是计算结果为索引的表达式被强制转换为数字。它实际上像所有对象键一样被强制转换为字符串(除了 Symbols,它仍然是 Symbols)。

因此,[1][[]] 变为 [1][""],并且由于数组中不存在 "" 属性,我们得到 undefined 而不是1.