真实和虚假价值的平等(JavaScript)

时间:2015-02-17 21:31:03

标签: javascript boolean equality

我遇到过翻译方面看起来不一致的事情,虽然我知道它可能有意义但我不理解它。它与评估真实/虚假价值和布尔值的平等有关。

示例1:

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

如果ID为'标题'在文档中找到,条件为真,因为对象的存在被认为是真实的。

示例2:

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

预先假定在文档中找到引用的元素。有人向我解释说,这个条件会评估为false,因为truthy值不等于布尔值true。

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

请考虑以下事项:

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

当您使用equals to运算符时,这是一个false等于0的情况。因为0被认为是假值,所以它等于布尔值false。值相同且数据类型不同。

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

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

3 个答案:

答案 0 :(得分:1)

document.getElementById('header')返回一个DOM对象或null。因此,在您的第二次比较中(假设它正在解析一个对象),您需要进行比较:

if (obj == true)

DOM对象不是==true

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

enter image description here

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

  
      
  1. 如果Type(x)是Object而Type(y)是String或Number,则返回比较结果ToPrimitive(x)== y。

  2.   
  3. 返回false。

  4.   

规则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===要求类型AND值相同,因此如果类型不相同,那么它甚至不会尝试比较该值。 ===没有进行任何类型转换,这是使用它的一个有用原因。


您应该了解,truthyfalsey规则仅适用于这样的一项检查,而且比较中没有=====

if (obj)

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

答案 1 :(得分:0)

  

预先假定在文档中找到引用的元素。有人向我解释说,这个条件会评估为false,因为truthy值不等于布尔值true。

你是对的,没有意义,因为向你解释的是错误

DOM元素的存在将评估为true,如果它不存在,它将评估为false(使用double-equals与triple)。如果他们使用的是三等号,您可以尝试: !!document.getElementById('someNodeId')它将返回一个布尔值。

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

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

编辑:我没有清楚地阅读示例或示例已更新。是的,你使用双倍相等。元素是真实的,但它不是“真实的”。

答案 2 :(得分:-1)

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

当您输入something == true时,您确实在检查是否something == 1。 如果某个东西不是布尔值,那么它就不会与1相同。

也许是对你的假设的解释"由于类型强制,对象的存在被认为是真实的,所以它应该是真的。"

  1. 如果任何truthy值等于true,
  2. 那么任何真值都等于任何真值(通过传递性,a = b,c = b,因此a = c),
  3. 然而,这并不适用于所有情况! ("蓝色" =="绿色",5 =="六"仅仅因为它们都是非假值。这会使==相当无价值! )
  4. 结论没有遵循,因此假设无效。一般来说,如果你需要检查两件事是否真的相同,你应该使用===。

    希望这可以解决问题!