为什么在JavaScript中未定义“ [] [[]]”

时间:2019-08-01 10:35:17

标签: javascript arrays undefined

我们钟爱的JavaScript可能很奇怪...

(![] + [])[+!+[] + +!+[]]                // 'l'
    + (![] + [])[+!+[]]                  // 'a'
    + ([![]] + [][[]])[+!+[] + [+[]]]    // 'i'
    + ([][[]] + [])[+!+[] + +!+[]]       // 'd'
 // Will output "laid"

JavaScript产生此输出的原因主要取决于数组的类型转换和+将“事物”转换为字符串的能力。 ![] // false+[] // 0的问题是JavaScript如何成功解析[][[]]为未定义但拒绝[][][]为语法错误

1 个答案:

答案 0 :(得分:6)

[]的含义取决于上下文

[][[]]

第一个[]创建一个新数组(数组文字语法)。

然后that_array[[]]尝试从该数组读取一个属性(方括号属性访问器语法)。

属性名称为[](也是数组文字语法),它是一个数组,被转换为字符串:''

由于没有名为空字符串的属性,因此它将解析为undefined

换句话说:

const array = [];
const propertyName = [].toString();
console.log(array[propertyName]);
[][][]

此错误的原因是,尽管第一个[]创建了一个数组,而第二个[]试图从中访问属性,但是没有包括属性名称的值。它在值之前有],因此第二个]是意外的。它永远不会到达第三个[]