【问题标题】:Conflicting boolean values of an empty JavaScript array空 JavaScript 数组的布尔值冲突
【发布时间】:2011-05-12 16:25:23
【问题描述】:

谁能解释为什么以下两个陈述都评估为true

[] == false

!![]

这个问题纯粹是出于好奇为什么会发生这种情况,而不是关于如何最好地测试数组是否为空。

【问题讨论】:

  • 如果您真的想动手,请查看第 11.9.1 节 ("The Equals Operator ==") 和第 8.7.1 节 (“GetValue(V)”) 在the spec。这将是另一个很好的例子,说明为什么 == true== false 通常不是理想的风格。 :-)
  • 实际上,使用 == 或 != 从来都不是好的风格。始终使用 === 或 !==,并手动转换操作数。

标签: javascript


【解决方案1】:

第一个:

[] == false

== 运算符对其操作数进行类型转换,在这种情况下双方都转换为数字,Abstract Equality Comparison Algorithm 上采取的步骤是:

  • 对象 == 布尔值
  • 对象 == 数字
  • 字符串 == 数字
  • 数字 == 数字

在代码中:

[] == false; // convert false to Number
[] == 0;     // convert [] to Primitive (toString/valueOf)
"" == 0;     // convert "" to Number
0  == 0;     // end

第二个比较,[]被转换为primitive,他们的valueOftoString方法被执行,但是由于valueOf在Array对象上,返回对象本身(继承自Object.prototype),那么使用toString 方法。

最后,如你所见,两个操作数都转换为数字,并且都产生零,例如:

Number([]) == 0;
Number(false) == 0;

而空数组在转换为 Number 时会产生零,因为它的字符串表示是一个空字符串:

[].toString(); // ""

一个空字符串转换为数字,产生零:

+""; // 0

现在,双重否定 (!![]) 产生 true,因为所有对象实例都是真实的:

![];  // false, [] is truthy
!![]; // true, negation

错误的唯一值是:

  • null
  • undefined
  • 0
  • NaN
  • ""(空字符串)
  • false

当转换为布尔值时,其他任何东西都会产生true

另见:

【讨论】:

  • 非常有趣。感谢您的详细描述和分享这些链接。
  • 哎呀,看起来我以同样的方式回答了同样的问题。直到有人将该问题标记为该问题的副本时才注意到。 stackoverflow.com/a/10556035/2653
【解决方案2】:

[] == 假

在这种情况下,左边的类型是object,右边的类型是boolean。当对象与 (== The Abstract Equality Comparison) 布尔值进行比较时,Javascript 首先将布尔值转换为数字,产生 0。然后将对象转换为“原始”,产生空字符串“”。接下来它将空字符串与 0 进行比较。将空字符串转换为数字,产生 0,在数字上等于右侧的 0,因此整个表达式的结果为 true。

参考: http://es5.github.com/#x11.9.3 11.9.3 抽象等式比较算法

!![]

在这种情况下,Javascript 将对象转换为布尔值 true,然后将其反转,结果为 false。

【讨论】:

猜你喜欢
  • 2014-12-11
  • 2013-10-02
  • 1970-01-01
  • 1970-01-01
  • 2019-04-09
  • 2020-11-24
  • 2021-01-18
  • 2022-06-14
相关资源
最近更新 更多