真值和假值相等 (JavaScript)

Equality of truthy and falsy values (JavaScript)

我遇到了解释器方面似乎不一致的事情,尽管我知道这可能是有道理的,但我只是不明白。它与评估 truthy/falsy 值和布尔值的相等性有关。

示例 1:

if (document.getElementById('header')) {
//run code here
}

如果在文档中找到 id 为 'header' 的元素,则条件为真,因为对象的存在被认为是真实的。

示例 2:

if (document.getElementById('header) == true) {
// run code here
}

假设在文档中找到引用的元素。有人向我解释说这个条件将评估为假,因为真值不等于布尔值真。

这似乎没有意义。由于类型强制,对象的存在被认为是真实的,因此即使数据类型不同,它也应该等于真实。

考虑以下几点:

(false == 0) // evaluates to true
(false === 0) // evaluates to false

在这种情况下,当您使用等于运算符时,假等于 0 为真。因为 0 被认为是 falsy 值,所以它等于布尔值 false。值相同,数据类型不同

对我来说,(document.getElementById('header') == true) 和 (false == 0) 是一回事。然而,他们都评估不同的东西。

有人可以向我解释为什么会这样吗?我一直在阅读对此的不同描述,但似乎没有人对其进行深入解释。

if() 语句执行时,检查括号内是否有真值。 == 运算符检查两个值在本质上是否相等。在JavaScript中,true和false分别==到1和0;因此,为什么您可以输入 (4 + true) 并得到 5,或输入 false*6 并得到 0!

当您键入 something == true 时,您实际上是在检查 something == 1。 如果某物不是布尔值,则它不会与 1 相同。

也许是对你的假设的解释"The presence of the object is considered truthy due to type coercion, so therefore it should equal true."

  1. 如果任何真值等于真,
  2. 则任何真值等于任何真值(通过传递属性,a=b,c=b,因此a=c),
  3. 然而,这并不适用于所有情况! ("blue" == "green", 5 == "six" 仅仅是因为它们都是非假值。这会使 == 相当毫无价值!)

结论不成立,故假设无效。一般来说,如果你需要检查两件事是否真的是同一件事,你应该使用===。

希望这能解决问题![​​=12=]

document.getElementById('header') returns 一个 DOM 对象或 null。所以,在你的第二次比较中(假设它正在解析一个对象),你正在比较:

if (obj == true)

一个DOM对象不是==true

要了解原因,您必须查看自动类型转换的 ECMAScript 规则,您可以在此处的 ECMAScript 5 规范中查看:http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.3.

比较 object == boolean 时的操作规则一直到规则 9 和 10。

  1. If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.

  2. Return false.

规则9是第一个规则,其中Type(x)Object,两者类型不一样,所以第一个检查。

因为 Type(y)Boolean,它没有通过规则 9。

因此,当它没有通过任何规则 1-9 时,它的计算结果为 false


当你做这个比较时:

(false == 0) // evaluates to true

您正在查看类型转换规则中的第 6 条规则:

ToNumber(false) == 0

这将解析为:

0 == 0

这将是 true


对于这个:

(false === 0)

每当您使用 === 时,如果两种类型不同,则结果立即为 false,因此计算结果为 false=== 要求类型和值相同,因此如果类型不相同,则它甚至不会尝试比较值。 === 从未进行过类型转换,这是使用它的有用原因之一。


你应该明白 truthyfalsey 规则只适用于像这样的单个检查,比较中没有 =====:

if (obj)

当您比较时它们不适用 x == y。为此,您必须参考规范第 11.9.3 节中的类型转换规则(上面链接)。

Presuppose the referenced element is found within the document. It was explained to me that this condition will evaluate to false because a truthy value does not equal a Boolean value of true.

你是对的,这没有道理,因为向你解释的人错了

DOM 元素的存在将评估为真,如果不存在,它将评估为假(使用双等号与三等号)。如果万一他们使用三等号,您可以简单地尝试: !!document.getElementById('someNodeId') 它将 return 一个布尔值。

如果您想确定,您可以随时在控制台中尝试此操作。

!!document.getElementById('notify-container');
>> true
!!document.getElementById('non-existing-node-goes-here');
>> false

编辑:我没看清楚例子或者例子更新了。是的,你使用的是双等号。该元素是真实的,但不是 "true"。