在JavaScript中为true==1和false==0

Is true == 1 and false == 0 in JavaScript?

本文关键字:false 中为 true JavaScript      更新时间:2023-09-26

我读了一本关于JavaScript的好书。

它始于:

布尔类型只接受两个文字值:true和false。这些值不同于数值,因此true不等于1,false不等于0。

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

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

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

但是,事实是什么?

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

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

在其他一些语言(例如Pascal、C#)中,有一种不同的布尔类型不是数字类型。可以在布尔值和数值之间进行转换,但这不会自动发生。

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

例如,即使数字不是布尔值,也可以在需要布尔值的地方使用数值。使用if (1) {...}和使用if (true) {...}一样有效。

在比较值时,如您的示例中所示,==运算符和===运算符之间存在差异。==相等运算符很乐意在类型之间进行转换以找到匹配,因此1 == true的计算结果为true,因为true转换为1===类型相等运算符不进行类型转换,因此1 === true的计算结果为false,因为值的类型不同。

在JavaScript中,==发音为"可能等于"。

我的意思是,JavaScript会自动将布尔值转换为整数,然后尝试比较两边。

对于真正的相等,请使用===运算符。

尝试严格的相等比较:

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

==运算符执行从一种类型到另一种类型的转换,而===运算符则不执行。

来自ECMAScript规范,章节11.9.3抽象等式比较算法

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

  • 如果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严格相等比较算法

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

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

啊,可怕的松散比较运算符再次出现。永远不要使用它。总是使用严格的比较,===或!===相反

额外的事实:0 == ''

当将某个东西与布尔值进行比较时,它的工作原理类似于以下

步骤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

实际上,如果javascript中的每个对象都有W3Cschools所说的"实值",那么它就会解析为true。这意味着除了""NaNundefinednull0之外的所有对象。

==运算符对布尔值测试数字确实有点奇怪,因为布尔值在比较之前会转换为数字1,这稍微违背了定义背后的逻辑。当你做这样的事情时,这会变得更加令人困惑:

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

不是javascript中的所有内容都有意义;)

使用===而不是==来等同变量。

==检查变量的值是否与相似

===检查变量的值和变量的类型是否相似

注意

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

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

给出不同的结果

在某种程度上,是的,它是1

在Chrome控制台中尝试以下示例:

> 2==true
false
> 1==true
true
> true + 1
2
> true + 2
3
> true + true
2

因此,答案是:

  • ,只要在任何算术上下文中使用true,它就会被视为数字1,或者正如李小龙所说,它就会变成1。同理,false实际上为零。但是,

  • no,如果你问Javascript对true有什么看法,它会说它是一个布尔值:

> typeof true
'boolean'

在一种松散类型的语言中,有时事情不是它们的样子,而是你如何看待它们,这并不奇怪。如果将true添加到字符串中,它将不会添加1,而是添加"true"作为字符串,因此归根结底,它决不等于一。让我用一个可怕的双关语结束这一切:

true不是一个数字,但它看起来像一个

==您本质上是在比较变量在与false比较时是false,还是在与true比较时是truthey。如果使用===,它将比较变量的确切值,因此true不会===1