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

时间:2018-03-15 23:09:38

标签: javascript arrays semantics coercion

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

因此编译器知道内部表达式[]必须是索引,因此在评估它之后,它会将其强制转换为数字。 Number([])评估为0,因此我们[][0]undefined

但是,[1][[]]并不像我期望的那样评估为1,而是undefined建议在这种情况下(或者也可能在前一种情况下),{{1} 不是被强制转换为数字。似乎我必须使用一元[]强制类型强制:

+

所以如果表达式[1][+[]] // returns 1 中的内部[]未被强制转换为数字,那么为什么该表达式会计算为[][[]]

2 个答案:

答案 0 :(得分:0)

您正在尝试使用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]

答案 1 :(得分:0)

错误的假设是,对索引求值的表达式被强制转换为数字。它实际上被强制为字符串,就像所有对象键一样。

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