这段代码如何弹出警报"n"?
这段代码是如何弹出"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,但这并不是实际发生的情况。修正了我的回答。