【问题标题】:JavaScript: Why []+(-~{}-~{}-~{}-~{})+(-~{}-~{}); returns "42"JavaScript:为什么 []+(-~{}-~{}-~{}-~{})+(-~{}-~{});返回“42”
【发布时间】:2015-06-11 20:25:36
【问题描述】:

在我的时事通讯中看到了这一点。在 Chrome 和 Firefox 上测试。我还是想不通。

[]+(-~{}-~{}-~{}-~{})+(-~{}-~{});    //=>  "42"

【问题讨论】:

标签: javascript


【解决方案1】:

评估:

~{}

使用内部函数进行评估:

~ToInt32({})

给出-1。

参考 ECMA 规范 - http://www.ecma-international.org/ecma-262/5.1/#sec-9.5 还有这个解释——http://jibbering.com/faq/notes/type-conversion/#tcToInt32

因此,在这种情况下

(-~{}-~{}) == 2
(-~{}-~{}-~{}-~{}) == 4

由于您在表达式的开头有[]+,因此javascript使用加号操作数,如字符串。所以你有"" + "4" + "2" = "42"

【讨论】:

  • 你比我快了大约 20 秒。 :)
  • ~ 是按位非运算符。它将0 转换为-1
  • {} != undefined(请随意测试)。
  • ~{}~ToInt32({}) 相同,将{} 转换为0。见ecma-international.org/ecma-262/5.1/#sec-9.5。在不引用规范的情况下回答此类问题是值得怀疑的。
  • 是不是因为未定义被解释为假。所以,~undefined = ~false = -1
【解决方案2】:

~ 运算符是按位非运算符。它返回一个数字的“1 的补码”。因为{} 被转换成一个数字,结果是NaN+{} == NaN 也会发生同样的情况。 ~NaN == -1 的按位非。所以:
(-~{}-~{}-~{}-~{}) == 4 & (-~{}-~{}) == 2

空数组的 DefaultValue 是一个空字符串。例如[]==[]+[] && []+[]==''

由此,完整的解析是: []+ /*converted to ''+*/ (-~{}-~{}-~{}-~{}) /*Equals numeric 4, but concatenated as a string to become '4'*/ + (-~{}-~{}) /*Equals numeric 2, but concatenated as a string to become '2'*/,最终结果实际上是'42'

您可以通过typeof([]+(-~{}-~{}-~{}-~{})+(-~{}-~{})) === 'string' 验证这一点

【讨论】:

    猜你喜欢
    • 2021-03-10
    • 1970-01-01
    • 2010-09-11
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 2019-11-17
    相关资源
    最近更新 更多