我正在读一本关于JavaScript的好书。
它始于:
布尔类型只取两个文字值:true和false。它们与数值不同,因此true不等于1,false不等于0.
然而,我观察到以下情况:
if(1==true)
document.write("oh!!! that's true"); //**this is displayed**
我知道,JavaScript中的每个类型都有一个布尔等价物。
然而,真相是什么?
答案 0 :(得分:59)
true
和false
确实不代表Javascript中的任何数值。
在某些语言(例如C,VB)中,布尔值被定义为实际数值,因此它们只是1和0(或-1和0)的不同名称。
在其他一些语言(例如Pascal,C#)中,有一个不是数字的明显布尔类型。可以在布尔值和数值之间进行转换,但不会自动发生。
Javascript属于具有明显布尔类型的类别,但另一方面,Javascript非常热衷于在不同数据类型之间转换值。
例如,虽然数字不是布尔值,但您可以使用期望布尔值的数值。使用if (1) {...}
与if (true) {...}
一样有用。
比较值时,如示例中所示,==
运算符和===
运算符之间存在差异。 ==
相等运算符很乐意在类型之间进行转换以查找匹配项,因此1 == true
的计算结果为true,因为true
已转换为1
。 ===
类型相等运算符不执行类型转换,因此1 === true
的计算结果为false,因为值的类型不同。
答案 1 :(得分:43)
在JavaScript中,==发音为“可能等于”。
我的意思是JavaScript会自动将布尔转换为整数,然后尝试比较双方。
对于真正的相等,请使用===运算符。
答案 2 :(得分:12)
尝试严格的相等比较:
if(1 === true)
document.write("oh!!! that's true"); //**this is not displayed**
==
运算符会从一种类型转换为另一种类型,而===
运算符则不会。
答案 3 :(得分:9)
根据ECMAScript规范,部分 11.9.3 The Abstract Equality Comparison Algorithm :
比较x == y,其中x和y是值,产生true或 假。这样的比较如下进行:
- 如果Type(y)为布尔值,则返回比较结果 x == ToNumber(y)。
因此,在if (1 == true)
中,true
被强制转换为Number
,即Number(true)
,这会产生1
的值,从而产生最终结果if (1 == 1)
true
。
if (0 == false)
是完全相同的逻辑,因为Number(false) == 0
。
当您使用严格等于运算符===
时,不会发生这种情况:
11.9.6 The Strict Equality Comparison Algorithm
比较x === y,其中x和y是值,产生true或 假。这样的比较如下进行:
- 如果Type(x)与Type(y)不同,则返回 false 。
答案 4 :(得分:3)
奖金事实:0 == ''
答案 5 :(得分:2)
实际上,如果javascript中的每个对象都有"一个真正的值"正如W3Cschools所说的那样。这意味着除""
,NaN
,undefined
,null
或0
之外的所有内容。
使用==
运算符对布尔值测试数字确实有点奇怪,因为布尔值在比较之前被转换为数字1,这违背了定义背后的逻辑。
当你做这样的事情时,这会变得更加混乱:
var fred = !!3; // will set fred to true
var joe = !!0; // will set joe to false
alert("fred = "+ fred + ", joe = "+ joe);

并非javascript中的所有内容都很有意义;)
答案 6 :(得分:1)
将某些内容与布尔值进行比较时,其工作原理如下
步骤1:将boolean
转换为Number
Number(true) // 1
和Number(false) // 0
第2步:比较双方
boolean == someting
-> Number(boolean) === someting
如果将1
和2
与true
进行比较,您将得到以下结果
true == 1
-> Number(true) === 1
-> 1 === 1
-> true
还有
true == 2
-> Number(true) === 1
-> 1 === 2
-> false
答案 7 :(得分:0)
使用===
来等同变量而不是==
。
==
检查变量的值是否相似
===
检查变量的值和变量的类型是否相似
注意
if(0===false) {
document.write("oh!!! that's true");
}
和
if(0==false) {
document.write("oh!!! that's true");
}
给出不同的结果
答案 8 :(得分:0)
Well ==是一个玩笑比较运算符,作为js开发人员,我们不能使用==进行比较。所有==比较问题开头都是无效的。
答案 9 :(得分:-1)
with ==你实际上是在比较false时判断变量是否为false,或者与true比较时是否为truthey。如果你使用===,它将比较变量的确切值,所以true不会=== 1