JS:为什么(![] + [])[+ []]返回"f"?

win*_*tex 1 javascript

如果您尝试运行以下代码,您将看到
(![]+[])[+1]返回"a";
(![]+[])[+2]返回"l";
(![]+[])[+3]返回"s".
等等.为什么?

Dan*_*nny 12

(![]+[])"false"以javascript 返回.在+1采用索引信1.因此a.

  • `(![] + [])`返回字符串`"false"`而不是布尔值,只是为了清楚. (3认同)

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)