gpt4 book ai didi

javascript - 为什么以及如何 ([![]]+[][[]])[+!+[]+[+[]]] 评估为字母 "i"?

转载 作者:行者123 更新时间:2023-11-28 06:24:42 26 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Why does ++[[]][+[]]+[+[]] return the string "10"?

(10 个回答)



(![]+[])[+[]]... Explain why this works

(1 个回答)


8年前关闭。




阅读时this article posted on dzone我最初找到了一段 JavaScript posted on Twitter by Marcus Lagergren .

以下代码显然打印了字符串 "fail"

(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]];

这涉及隐式类型转换,我试图了解这一行是如何解释的。

我已经隔离了每个 Angular 色
  • (![]+[])[+[]]打印 "f"
  • (![]+[])[+!+[]]打印 "a"
  • ([![]]+[][[]])[+!+[]+[+[]]]打印 "i"
  • (![]+[])[!+[]+!+[]]打印 "l"

  • 除了 "i" 之外,我还设法分解了返回每个字母的表达式。

    "f" ![]一个空数组是一个对象,根据 ECMAScript documentation, point 9.2计算结果为 true当转换为 boolean所以这是 false false+[]根据 Point 11.6.1二进制 + 的两个参数运算符被转换为字符串,因此我们得到 "false"+"" ,计算 "false" +[]一元加号运算符会导致 ToNumber转换后跟 ToPrimitive如果参数是 Object 则进行转换.这种转换的结果是通过调用 [[DefaultValue]] 来确定的。对象的内部方法。如果是空数组,则默认为 0 .
    (ECMAScript 文档,章节: 11.4.69.39.1)
    "false"[0]我们正在访问索引 0 处的字符,因此 "f"
    "a"
    同样的故事,这里唯一的区别是方括号中的部分的附加转换(计算为一个数字以指向字符串中的另一个字符 "false" ),由使用一元 + 触发和 !运营商。
    +[]计算结果为 0 ,如上所述。
    !0计算结果为 true定义见 Section 9.2Section 11.4.9 .一、 0转换为 bool 值 false然后运算符反转该值。
    +true再次,一元加号触发 ToNumber转换,返回 1对于二进制 true( Section 11.4.69.3 )
    "false"[1]返回字符串中的第二个字符,即 "a"
    字母“l”
    !+[]计算结果为 true如上所述
    true+true使用二进制 +在原语上触发 ToNumber转换。如果为真,其结果为 11+1等于 2 "false"[2] - 自我解释

    "i"
    让我难过的是这封信 "i" .我可以看到第二部分(在方括号中)计算为字符串 "10"并且第一部分(在括号中)返回 "falseundefined"但是 我无法判断这是如何发生的。有人可以逐步解释吗? 尤其是方括号的神奇之处? (数组和数组访问)

    如果可能的话,我希望每个步骤都包含一个指向底层 ECMAScript 规则的链接。

    我觉得最神秘的是这部分: [][[]]

    最佳答案

    如果您稍微重写一下,您的神秘部分并不是那么神秘:

    []['']
    []将被强制转换为字符串,因为它不是整数,因此您正在寻找 [] 的属性名称为 '' (一个空字符串)。你会得到 undefined ,因为没有具有该名称的属性。

    至于实际的字母,将表达式分解为两个主要部分:
  • 字符串 ([![]]+[][[]]) :
  • [![]][false] .
  • [][[]]undefined .
  • 将它们加在一起,您将得到 "falseundefined" .
  • 和索引:[+!+[]+[+[]]] .一些空格和括号会使操作更清晰:[+(!(+[])) + [+[]]] :
  • [+[]] [0] .
  • +[]强制 []为整数,所以你得到 0 .
  • !+[]强制 0一个 bool 值并取反,所以你得到 true .
  • +!+[]强制 true为整数,所以你得到 1 .
  • 将它们加在一起,您将得到 ["10"] .

  • 当使用字符串访问数组的属性并且该字符串恰好是数组的一个元素时,该字符串被强制转换为一个整数,然后您将返回数组的实际元素:
    > [1, 2, 3]["0"]
    1
    > [1, 2, 3]["1"]
    2

    所以你的最终结果是:
    > "falseundefined"["10"]
    "i"

    阅读 this answer [false] + undefined 的解释部分。

    关于javascript - 为什么以及如何 ([![]]+[][[]])[+!+[]+[+[]]] 评估为字母 "i"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35233446/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com