如果您尝试运行以下代码,您将看到
(![]+[])[+1]返回"a";
(![]+[])[+2]返回"l";
(![]+[])[+3]返回"s".
等等.为什么?
Dan*_*nny 12
(![]+[])"false"以javascript 返回.在+1采用索引信1.因此a.
kev*_*ner 10
让我们一块一块地分解它.
> ![]
false
Run Code Online (Sandbox Code Playgroud)
即使在空的情况下,数组文字仍然是真实的,因此否定是布尔值假的.
> ![]+[]
"false"
Run Code Online (Sandbox Code Playgroud)
"false"由于JS添加任意对象的奇怪规则,将布尔值(上面的false)添加到空数组会产生字符串版本.
> (![]+[])[1]
"a"
> (![]+[])[3]
"s"
(etc)
Run Code Online (Sandbox Code Playgroud)
相当于:
> "false"[1]
"a"
> "false"[3]
"s"
Run Code Online (Sandbox Code Playgroud)
依此类推 - 索引字符串会返回该索引处的字符.
最后,
> +[]
0
Run Code Online (Sandbox Code Playgroud)
所以
> "false"[+[]]
"f"
Run Code Online (Sandbox Code Playgroud)
把它们放在一起:
> (![]+[])[+[]]
"f"
Run Code Online (Sandbox Code Playgroud)