这段代码如何提醒"n"?

nic*_*ael 0 javascript

以下代码警告"n".这段代码是如何工作的?

alert(([]+[][1])[[[+!-[]][0]]])
Run Code Online (Sandbox Code Playgroud)

Cer*_*rus 5

所以,它提醒([]+[][1])[[[+!-[]][0]]].

让我们打破这个:

    -[]      // -0   (Apparently -`array` == -0)
   !-[]      // true (Boolean NOT on -1 == true)
  +!-[]      //  1   (+ casts `true` to a number (1))
 [+!-[]]     // [1]  (add array brackets) (wow that's cheap)
 [+!-[]][0]  //  1   (get 1st element of the array) 
[[+!-[]][0]] // [1]  (add array brackets)

    []       // []          (Empty array)
    [][1]    // "undefined" (empty string @ 1 == undefined)
 []+[][1]    // ""          (undefined + array == undefined)
([]+[][1])   // "undefined"

"undefined"[[1]]         // "n" (Get the character at zero-indexed position `1`)
([]+[][1])[[[+!-[]][0]]] // "n"
Run Code Online (Sandbox Code Playgroud)

访问数组时,额外的方括号无关紧要:

[1][[[[[[0]]]]]] === [1][0] === [1]["0"] === 1;
Run Code Online (Sandbox Code Playgroud)

这是因为,在幕后,提供的索引将转换为字符串:

[[[[[0]]]]].toString() === "0";
Run Code Online (Sandbox Code Playgroud)