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

Why is "[][[]]" undefined in JavaScript

我们的挚爱 JavaScript 可能会很奇怪...

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

之所以JavaScript产生这个输出,主要是靠数组的类型转换和+把'things'转换成字符串的能力。 ![] // false+[] // 0 我的问题是 JavaScript 如何成功地将 [][[]] 解析为未定义但拒绝 [][][] 作为语法错误

[] 根据上下文表示不同的意思

[][[]]

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

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

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

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

换句话说:

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

这个错误是因为当第一个 [] 创建一个数组时,第二个 [] 试图从中访问 属性 但没有包含 [=42= 的值] 姓名。它在值之前有 ],所以第二个 ] 是意外的。它永远不会到达第三个 [].