我们钟爱的JavaScript可能很奇怪...
(![] + [])[+!+[] + +!+[]] // 'l'
+ (![] + [])[+!+[]] // 'a'
+ ([![]] + [][[]])[+!+[] + [+[]]] // 'i'
+ ([][[]] + [])[+!+[] + +!+[]] // 'd'
// Will output "laid"
JavaScript产生此输出的原因主要取决于数组的类型转换和+将“事物”转换为字符串的能力。 ![] // false
而+[] // 0
的问题是JavaScript如何成功解析[][[]]
为未定义但拒绝[][][]
为语法错误
答案 0 :(得分:6)
[]
的含义取决于上下文
[][[]]
第一个[]
创建一个新数组(数组文字语法)。
然后that_array[[]]
尝试从该数组读取一个属性(方括号属性访问器语法)。
属性名称为[]
(也是数组文字语法),它是一个数组,被转换为字符串:''
由于没有名为空字符串的属性,因此它将解析为undefined
。
换句话说:
const array = [];
const propertyName = [].toString();
console.log(array[propertyName]);
[][][]
此错误的原因是,尽管第一个[]
创建了一个数组,而第二个[]
试图从中访问属性,但是没有包括属性名称的值。它在值之前有]
,因此第二个]
是意外的。它永远不会到达第三个[]
。