我们钟爱的 JavaScript 可能非常奇怪......
(![] + [])[+!+[] + +!+[]] // 'l'
+ (![] + [])[+!+[]] // 'a'
+ ([![]] + [][[]])[+!+[] + [+[]]] // 'i'
+ ([][[]] + [])[+!+[] + +!+[]] // 'd'
// Will output "laid"
JavaScript 产生这个输出的原因主要取决于数组的类型转换和 + 将“事物”转换为字符串的能力。 ![]//false
而 +[]//0
我的问题是 JavaScript 如何成功地将 [][[]]
解析为未定义但拒绝 [][][]
作为语法错误
最佳答案
[]
根据上下文表示不同的东西
[][[]]
第一个 []
创建一个新数组(数组文字语法)。
然后 that_array[[]]
尝试从该数组中读取属性(方括号属性访问器语法)。
属性名称是[]
(也是数组文字语法),它是一个数组,被转换为一个字符串:''
因为没有名为空字符串的属性,所以它解析为undefined
。
换句话说:
const array = [];
const propertyName = [].toString();
console.log(array[propertyName]);
[][][]
这个错误是因为当第一个 []
创建一个数组时,第二个 []
试图从它访问一个属性但是没有包含属性名称的值.它在值之前有 ]
,因此第二个 ]
是意外的。它永远不会到达第三个 []
。
关于javascript - 为什么 "[][[]]"在 JavaScript 中未定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57307089/