【问题标题】:JavaScript type coercion with strings and indexing带有字符串和索引的 JavaScript 类型强制
【发布时间】:2015-09-01 17:03:25
【问题描述】:

在下面的 sn-p 中,为什么whatDoesItDo() 函数将“失败”作为字符串返回? 如果有人能解释这种行为背后的概念会很有帮助。

function whatDoesItDo() {

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

}

function result() {

  document.getElementById("result").innerHTML = whatDoesItDo();

}

result();
<html>

<body>
  <p id="result"></p>
</body>

</html>

【问题讨论】:

  • 您的预期输出是什么?
  • "fail" 是输出。但问题是为什么?
  • 如果搜索这类问题更容易就好了。像这样的问题被问过太多次了。
  • @FelixKling:也许我们应该添加一个标签,比如javascript-coercion-games,这样我们以后可以找到它们。 :-)
  • @FelixKling:我最终称它为js-type-coercion-puzzles。我们会看看它是否能存活下来。 :-)

标签: javascript type-conversion type-coercion


【解决方案1】:

您将看到 A) 类型强制、B) 使用 [] 对字符串进行索引以及 C) 字符串连接的效果。

我们来看第一个位:

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

![] 给了我们false,因为[] 是一个“真实”值,当测试为布尔值时它会强制转换为true,因此![]false

然后我们将[] 添加到它,这会将它们都转换为字符串,因为+ 运算符将其两个参数强制转换为字符串,如果它们中的任何一个不是数字(如果两者都是数字,则添加),给出我们"false"(因为[].toString()[].join()"")。

所以现在我们有了"false"

那么,+[]0,因为它将空数组强制转换为一个数字,这会将它作为一个字符串 (""),而 +""0

最后,该值用于"false""false"[0]"f"。

等等,其余的只是该主题的变体。 (!+[]true,后面很重要。)

【讨论】:

  • '+' 操作符有两个参数.....所以如果一个是 0 那么第二个参数是什么
  • @Flake:在 JavaScript 中有两个 + 运算符(以及从语法上派生自语言 B 的大多数其他编程语言):unary +(一元 = 接受一个操作数)和 binary + (二进制 = 需要两个操作数)。 +[] 中的 + 是一元 +。在 JavaScript 中,几乎它唯一的工作就是将其操作数强制为一个数字。
  • @T.J.Crowder 好的,我不得不问 - 在找到你关于 meta 的问题后完全出于好奇。我得到的是fal 来自“铸造”布尔到字符串,并且只得到该字符串的第 n 个字符。但是i 来自哪里?
  • @b.enoit.be [][[]][][""] 这是 undefined :-)
  • @b.enoit.be:卢卡斯说了什么。 :-) 具体来说,([![]] + [][[]]) 最终成为falseundefined。我们使用+!+[] + [+[]] 对其进行索引,最终为"10"falseundefined 的第 11 个字符是 i
猜你喜欢
  • 1970-01-01
  • 2011-10-06
  • 2019-06-08
  • 1970-01-01
  • 2019-10-27
  • 2013-05-30
  • 2020-01-06
  • 1970-01-01
  • 2020-12-26
相关资源
最近更新 更多