真要解释我也解释不来,大概是这么个思路:
[]这是数组字面量
逻辑非(取反)操作符会将所有东西转成
boolean:
![]
false!![]
true
+X正号将所有东西转成
number;
X+[]这个实际上执行了
X.toString() + [].toString(),相当于直接给 X toString 了;
[][+[]]要获得
undefined可以访问数组里不存在的元素,这里访问
0就行;
然后就可以获得
true,
false,
undefined字符形式里的字符了:
![]+[] // 'false'!![]+[] // 'true'[][+[]]+[] // 'undefined'
然后随便选一个可以访问的函数(注意这里说“可以访问“,因为我们得到的字符还不完全),我们就可以获得更多字符,这里选用
Array.prototype.find:
[][...从 undefined 中拆出来 'find']+[]// => 'function find() { [ native pre ] }'并且可以获得
Function构造器,这使得我们可以执行任何字符串形式的代码:
[][...从 undefined 中拆出来 'find'][...从各处拆出来 'constructor']// => function Function() { [ native pre ] }[][...从 undefined 中拆出来 'find'][...从各处拆出来 'constructor'](...字符串形式的代码)()// 这可以执行这段字符串形式的代码还有一堆依赖废弃方法等等的 hack,我看着有点恶心,就不讲了



