带有字符串和索引的 JavaScript 类型强制

标签 javascript type-conversion type-coercion

在下面的代码片段中,为什么 whatDoesItDo() 函数将“fail”作为字符串返回? 如果有人可以解释这种行为背后的概念,那将会很有帮助。

function whatDoesItDo() {

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

}

function result() {

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

}

result();
<html>

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

</html>

最佳答案

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

让我们先看一下:

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

![] 给我们 false 因为 [] 是一个强制为 true 的“真实”值当作为 bool 值测试时,![]false

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

所以现在我们有了 "false"

然后,+[]0,因为它将空数组强制转换为一个数字,使其成为一个字符串 (""), +""0

最后,该值用于 “false”:“false”[0]“f”。

依此类推,其余部分只是该主题的变体。 (!+[]true,稍后很重要。)

关于带有字符串和索引的 JavaScript 类型强制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30875019/

相关文章:

javascript - 获取 UL 的宽度

javascript - 使用 JavaScript 访问 Repeater 值

C++ 指针强制转换运算符

javascript - 对象的隐式类型强制

python - WTForms 如何使用 DecimalField 在错误输入时生成正确的字段错误

python - 将值分配给 numpy 数组中的位置而不修改数组

javascript - jQuery 菜单系统 - 显示没有顶级菜单项扩展以适应的子菜单项

javascript - 简单的 Python 和 Ajax 示例 如何使用 Python 发送响应?

powershell - 解析空格分隔的字段

c++ - 将 C++ 类转换为另一个类以创建 OpenCV 轨迹栏句柄