【问题标题】:JavaScript: Why is []==![]?JavaScript:为什么是 []==![]?
【发布时间】:2012-10-13 08:10:51
【问题描述】:

在 JavaScript 中,我注意到 []==![] 结果是 truedemo

我不明白这个结果。你能解释一下原因吗?

【问题讨论】:

  • @zengr:我不知道。这对我来说似乎是一个完全不同的问题。
  • @BoltClock: [] 在布尔上下文中为真,因此 ![] 为假,之后代码执行 [] == false,结果为真。
  • @AnttiHaapala:这并不完全正确——[1] 在布尔上下文中为真,但![1] 为假,[1] == false 也产生假。这不是布尔上下文,而是== 算法。
  • @BoltClock 我同意@Antti。答案详细描述了[]![]的转换,回答了这个问题。
  • @zengr:这不是同一个问题。

标签: javascript


【解决方案1】:

[] 是一个数组,但![] 是一个布尔值。每当您尝试使用== 比较具有不同类型的两个对象时,这两个对象都应转换为可比较的对象(使用ToNumber,请参见11.9.3 中的步骤7)。这就是为什么 [] == ![] 产生 true 的原因,第一个空数组被评估为 false

11.9.3 The Abstract Equality Comparison Algorithm

比较 x == y,其中 x 和 y 是值,产生真或假。这样的比较被执行为 如下:

  1. [...]
  2. 如果 x 为空且 y 未定义,则返回 true。
  3. 如果 x 未定义且 y 为空,则返回 true。
  4. 如果 Type(x) 是 Number 并且 Type(y) 是 String, 返回比较结果 x == ToNumber(y)。
  5. 如果 Type(x) 是字符串并且 Type(y) 是数字, 返回比较结果 ToNumber(x) == y。
  6. 如果 Type(x) 是 Boolean,则返回 ToNumber(x) == y 的比较结果。
  7. 如果 Type(y) 是 Boolean,则返回比较结果 x == ToNumber(y)。
  8. 如果 Type(x) 是 String 或 Number 并且 Type(y) 是 Object, 返回比较结果 x == ToPrimitive(y)。
  9. 如果 Type(x) 是 Object 并且 Type(y) 是字符串或数字, 返回比较 ToPrimitive(x) == y 的结果。
  10. 返回 false。

但是,如果您使用严格的类型比较运算符 ===,则结果为 false,因为两种类型不同:

11.9.6 The Strict Equality Comparison Algorithm

比较 x === y,其中 x 和 y 是值,产生真或假。进行这样的比较 如下:

  1. 如果 Type(x) 与 Type(y) 不同,则返回 false。
  2. 如果 Type(x) 未定义,则返回 true。
  3. 如果 Type(x) 为 Null,则返回 true。
  4. 如果类型(x)是数字,那么
    1. 如果 x 为 NaN,则返回 false。
    2. 如果 y 是 NaN,则返回 false。
    3. 如果 x 与 y 的数值相同,则返回 true。
    4. 如果 x 为 +0 且 y 为 -0,则返回 true。
    5. 如果 x 为 -0 且 y 为 +0,则返回 true。
    6. 返回假。
  5. 如果 Type(x) 是字符串,那么如果 x 和 y 是完全相同的字符序列(相同的长度和 对应位置的相同字符);否则,返回假。
  6. 如果 Type(x) 是布尔值,如果 x 和 y 都为真或都为假,则返回真;否则,返回假。
  7. 如果 x 和 y 引用同一个对象,则返回 true。否则,返回 false。

【讨论】:

  • 请详细说明“转换为可比较的对象。这就是为什么 [] == ![] 产生 true”。这个答案看起来像是没有证据的猜测。 RE:编辑:仍然不够。相关部分是第 11.9.3 节。您可以按照定义的步骤得出正确的结论。
  • @RobW:我注意到我的错误并删除了错误的相等运算符。我花了一点时间来加载 ECMA-262.pdf,我的连接速度像 BASIC 一样慢。
  • @RobW:谢谢收藏。我还在我的硬盘上保存了一份副本,这应该会派上用场
  • []==![] 发生的事情是[]![] 之间的抽象相等比较注意typeof(![])booleantypeof([])object。从文档 For x == y, If Type(y) is Boolean, 返回比较结果 x == ToNumber(y)。 ![] 的 ToNumber 即 false 是 0 所以,它归结为 [] == 0 并且 []==0 的结果是 true
  • @kidmenot:显然在星期六早上还为时过早。修正了我的答案。
猜你喜欢
  • 2013-07-24
  • 2012-01-31
  • 2014-12-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-07
  • 2016-02-05
  • 1970-01-01
相关资源
最近更新 更多