【问题标题】:How does this code alert "n"? [duplicate]此代码如何提醒“n”? [复制]
【发布时间】:2014-08-16 01:51:38
【问题描述】:

以下代码警告“n”。这段代码是如何工作的?

alert(([]+[][1])[[[+!-[]][0]]])

【问题讨论】:

  • 这可能是相关的:stackoverflow.com/q/15978204/1249581.
  • 等等,“不清楚你在问什么”?什么不清楚?
  • 同意;关闭它可能有充分的理由(可能是重复的),但为了清楚起见,它高于标准。
  • @nicael 我们要求问题有明确的问题陈述,以便对未来的访问者有用;您最初的标题和正文不清楚,对未来的访问者也没有用处。
  • @nicael 处理浏览器控制台中的子表达式。无论如何,如果您这样做,您会更好地理解它。另请注意,没有可以从中学习有用的 JavaScript 编码技能,但它可能有助于识别由意外陷入这种诡计的代码引起的奇怪错误行为。

标签: javascript


【解决方案1】:

所以,它会提醒([]+[][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"

在访问数组时,额外的方括号并不重要:

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

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

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

【讨论】:

  • THX,Cerbus。现在很清楚了。
  • 实际上表达式的第一部分并没有以这种方式进行干预。这里 []+[][1] 首先是评估第二个空括号。 [] - 你得到一个空数组。 [][1] - 空数组的索引返回未定义。 [] + [][1] - 将空数组转换为空字符串,空字符串加上 undefined 为您提供“未定义”作为字符串。另一部分是正确的。您可以尝试在不同的地方添加括号来检查优先级。
  • 哦,是的,你是对的!不过,我确实在控制台中检查了我的代码,[]+[] 实际上等于""""[1] == undefined,但事实并非如此。修正了我的答案。
猜你喜欢
  • 2019-04-09
  • 1970-01-01
  • 2023-03-10
  • 2011-09-26
  • 2015-08-19
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多