【问题标题】:[[]] == false. Why? [duplicate][[]] == false. Why? [duplicate]
【发布时间】:2020-08-25 18:15:24
【问题描述】:

一个错误让我在 45 分钟的循环中摸不着头脑,当我终于意识到分配一个包含另一个(空)数组 myArray = [[]] 的数组时,它与 false 等价:

if (myArray == false) {} // true

我知道if (myArray === false) {} // false,但为什么长度> 0 的数组完全等同于false

【问题讨论】:

  • 我想你不知何故感到困惑,空数组和带有元素的数组评估为true
  • @thedude - 他们没有混淆,[[]] == false 的结果确实是true
  • 当您调用 (myArray == false) 时,您比较该 myArray 对象的值(数组是 javascript 中的对象实例),然后调用 myArray.toString(),它返回一个空字符串“ ”。这是因为在 Array 上调用 toString 返回 Array.join(),而空字符串是 JavaScript 中的假值之一。
  • @T.J.Crowder 哇,另一个关于 javascript 行为的有趣讨论,如果我没有看到,谢谢。

标签: javascript


【解决方案1】:

当您调用[[]] == false 时,您将比较数组的值和原始布尔值。所以toString() 方法被调用。 [[]].toString() is equal to '' 所以你会比较 '' == false 是真的。

【讨论】:

    【解决方案2】:

    这是因为== 通过Abstract Equality Comparison 操作递归地将其操作数转换为可以比较的东西,直到它们的类型相同:

    • x == y 中,因为y 是布尔值,所以它执行x == ToNumber(y) (ToNumber) 的结果。
    • ToNumber(false)0,所以它是 x == 0
    • 因为x 是一个对象而0 是一个数字,所以它确实是ToPrimitive(x) == 0。 (ToPrimitive.)
    • ToPrimitive([[]])"" 因为它最终在数组上执行 join(通过 Array.prototype.toString),将操作数转换为字符串。所以现在我们有了"" == 0
    • 算法执行ToNumber("") == 0ToNumber("")0,所以我们最终得到 0 == 0,这是真的。

    (在查看规范中的算法时,不要在ToNumber 之类的操作前被! 抛出。它确实不是 表示否定之类的会在 JavaScript 中。这意味着该操作永远不会返回突然完成。This guide 阅读规范有助于解决此类问题。)

    【讨论】:

      猜你喜欢
      • 2022-12-01
      • 2022-12-02
      • 1970-01-01
      • 2021-01-15
      • 2022-11-20
      • 2022-12-02
      • 2022-12-02
      • 2022-12-01
      • 1970-01-01
      相关资源
      最近更新 更多