我遇到过翻译方面看起来不一致的事情,虽然我知道它可能有意义但我不理解它。它与评估真实/虚假价值和布尔值的平等有关。
示例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)是一回事。然而,他们都评价不同的东西。
有人可以向我解释为什么会这样吗?我一直在阅读不同的描述,但似乎没有人能够深入解释。
答案 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。
比较object == boolean
时的操作规则一直到规则9和10。
如果Type(x)是Object而Type(y)是String或Number,则返回比较结果ToPrimitive(x)== y。
- 醇>
返回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
。 ===
要求类型AND值相同,因此如果类型不相同,那么它甚至不会尝试比较该值。 ===
没有进行任何类型转换,这是使用它的一个有用原因。
您应该了解,truthy
和falsey
规则仅适用于这样的一项检查,而且比较中没有==
或===
:
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相同。
也许是对你的假设的解释"由于类型强制,对象的存在被认为是真实的,所以它应该是真的。"
结论没有遵循,因此假设无效。一般来说,如果你需要检查两件事是否真的相同,你应该使用===。
希望这可以解决问题!