在JavaScript中是否为true == 1和false == 0?

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

它始于:

布尔types只取两个文字值:true和false。 这些不同于数字值,所以true不等于1,false不等于0。

不过,我观察到以下情况:

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

我知道,JavaScript中的每一个types都有一个布尔等值。

但是,那么真相是什么?

确实, truefalse不代表Javascript中的任何数值。

在某些语言(如C,VB)中,布尔值被定义为实际的数值,所以它们只是1和0(或-1和0)的不同名称。

在其他一些语言(例如Pascal,C#)中,有一个不是数值的独特的布尔types。 可以在布尔值和数值之间进行转换,但不会自动发生。

JavaScript属于具有独特布尔types的类别,但另一方面,JavaScript非常热衷于在不同数据types之间转换值。

例如,尽pipe一个数字不是一个布尔值,但是可以在预期布尔值的地方使用数字值。 使用if (1) {...}if (true) {...}

在比较值时,就像在你的例子中那样, ==运算符和===运算符是有区别的。 ==相等运算符在types之间快速转换以find匹配,所以1 == true为true,因为true被转换为1===types相等运算符不会进行types转换,所以1 === true是false,因为这些值是不同的types。

在JavaScript中,==发音为“Probably Equals”。

我的意思是,JavaScript会自动将布尔转换为一个整数,然后尝试比较双方。

为了实现平等,请使用===运算符。

尝试严格的平等比较:

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

==运算符从一种types转换到另一种types, ===运算符不会。

根据ECMAScript规范,第11.9.3“抽象相等性比较algorithm

比较x == y,其中x和y是值,产生true或false。 这样的比较如下进行:

  • 如果Type(y)是布尔型,则返回比较结果x == ToNumber(y)

因此, if (1 == true)if (1 == true)被强制转换为一个Number ,即Number(true) ,其结果为1 ,得到最终的if (1 == 1)

if (0 == false)是完全相同的逻辑,因为Number(false) == 0

当您使用严格的等号运算符===时,不会发生这种情况:

11.9.6严格平等比较algorithm

比较x === y,其中x和y是值,产生true或false。 这样的比较如下进行:

  • 如果Type(x)与Type(y)不同,则返回false

啊,可怕的松散比较运营商再次罢工。 永远不要使用它。 总是使用严格的比较,===或!==代替。

奖金事实: 0 == ''

实际上,如果W3Cschool提供的话,每个对象在javascript中都具有“真正的价值”。 这意味着除了""NaNundefinednull0

使用==运算符对布尔值进行testing确实有点奇怪,因为在比较之前布尔值被转换为数字1,这稍稍违背了定义的逻辑。 当你做这样的事情时,这会变得更加混乱:

  var fred = !!3; // will set fred to true var joe = !!0; // will set joe to false alert("fred = "+ fred + ", joe = "+ joe); 

使用===将variables等同于==

==检查variables的值是否相似

===检查variables的值和variables的types是否相似

注意如何

 if(0===false) { document.write("oh!!! that's true"); }​ 

 if(0==false) { document.write("oh!!! that's true"); }​ 

给出不同的结果

与==你本质上是比较一个variables是falsey时比较错误或真正比较真实。 如果您使用===,它会比较variables的确切值,所以真正不会=== 1

它也是另一种方式。 如果你写:

 alert(Math.pow((7>3),2)); 

您将得到1(或1平方)的值,因为它将条件直线转换为1的值。