这段代码如何弹出警报"n"?

7 浏览
0 Comments

这段代码如何弹出警报"n"?

以下代码弹出 \"n\"。这段代码是如何工作的?\nalert(([]+[][1])[[[+!-[]][0]]])

0
0 Comments

这段代码是如何弹出"n"的呢?这个问题的出现的原因是什么?我们来拆分一下这段代码:

-[] // -0 (显然 -`数组` == -0)

!-[] // true (对-1进行布尔非运算得到true)

+!-[] // 1 (+将`true`转换为数字1)

[+!-[]] // [1] (加上数组括号) (哇,太便宜了)

[+!-[]][0] // 1 (取数组的第一个元素)

[[+!-[]][0]] // [1] (加上数组括号)

[] // [] (空数组)

[][1] // "undefined" (在索引1处的空字符串为undefined)

[]+[][1] // "" (undefined加上数组等于undefined)

([]+[][1]) // "undefined"

"undefined"[[1]] // "n" (获取以0为基准的位置为1的字符)

([]+[][1])[[[+!-[]][0]]] // "n"

多余的方括号在访问数组时并没有太大的意义:

[1][[[[[[0]]]]]] === [1][0] === [1]["0"] === 1;

这是因为,在幕后,提供的索引会被转换为一个字符串:

[[[[[0]]]]].toString() === "0";

谢谢Cerbus的解释,现在清楚了。

实际上,表达式的第一部分并不是以这种方式解释的。在[]+[][1]中,首先计算第二个空括号。[]得到一个空数组。[][1]对空数组进行索引返回undefined。[] + [][1]将空数组转换为空字符串,而空字符串加上undefined得到"undefined"作为字符串。另一部分是正确的。你可以尝试在不同的位置添加括号来检查优先级。

哦,是的,你说得对!我在控制台中检查了我的代码,确实,[]+[]实际上等于"",而""[1] == undefined,但这并不是实际发生的情况。修正了我的回答。

0