JavaScript中是真的== 1和假= = 0?

时间:2012-09-02 13:18:43

标签: javascript type-conversion

我正在读一本关于JavaScript的好书。

它始于:

  

布尔类型只取两个文字值:true和false。它们与数值不同,因此true不等于1,false不等于0.

然而,我观察到以下情况:

if(1==true)
  document.write("oh!!! that's true");  //**this is displayed**

我知道,JavaScript中的每个类型都有一个布尔等价物。

然而,真相是什么?

10 个答案:

答案 0 :(得分:59)

truefalse确实不代表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所说的那样。这意味着除""NaNundefinednull0之外的所有内容。

使用==运算符对布尔值测试数字确实有点奇怪,因为布尔值在比较之前被转换为数字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) // 1Number(false) // 0

第2步:比较双方

boolean == someting 
-> Number(boolean) === someting

如果将12true进行比较,您将得到以下结果

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