在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都有一个布尔等值。
但是,那么真相是什么?
确实, true
和false
不代表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中都具有“真正的价值”。 这意味着除了""
, NaN
, undefined
, null
或0
。
使用==
运算符对布尔值进行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的值。