真值和假值相等 (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."
- 如果任何真值等于真,
- 则任何真值等于任何真值(通过传递属性,a=b,c=b,因此a=c),
- 然而,这并不适用于所有情况! ("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。
If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.
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
。 ===
要求类型和值相同,因此如果类型不相同,则它甚至不会尝试比较值。 ===
从未进行过类型转换,这是使用它的有用原因之一。
你应该明白 truthy
和 falsey
规则只适用于像这样的单个检查,比较中没有 ==
或 ===
:
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"。
我遇到了解释器方面似乎不一致的事情,尽管我知道这可能是有道理的,但我只是不明白。它与评估 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."
- 如果任何真值等于真,
- 则任何真值等于任何真值(通过传递属性,a=b,c=b,因此a=c),
- 然而,这并不适用于所有情况! ("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。
If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.
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
。 ===
要求类型和值相同,因此如果类型不相同,则它甚至不会尝试比较值。 ===
从未进行过类型转换,这是使用它的有用原因之一。
你应该明白 truthy
和 falsey
规则只适用于像这样的单个检查,比较中没有 ==
或 ===
:
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"。