为什么在 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= 的值] 姓名。它在值之前有 ]
,所以第二个 ]
是意外的。它永远不会到达第三个 []
.
我们的挚爱 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= 的值] 姓名。它在值之前有 ]
,所以第二个 ]
是意外的。它永远不会到达第三个 []
.