在JavaScript中,true等于1且false等于0吗?

59

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

它起始于:

布尔类型只有两个字面值:true和false。它们与数字值不同,所以true不等于1,false不等于0。

但是,我注意到以下内容:

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

我知道,在JavaScript中每种类型都有一个对应的布尔值。

但是,真相是什么呢?


可能重复 (Possible duplicate):(https://dev59.com/Z3RC5IYBdhLWcg3wROpQ) - Jeroen
另一个非常相似的问题(尽管来自@Jeroen的那个有更好的答案):http://stackoverflow.com/questions/8265401/undesirable-behavior-of-javascript-operator - apsillers
1
我们在谈论哪本“好书”? - Pointy
@Pointy 这是 Wrox 专业 JavaScript。 - Mahesha999
@Mahesha999 好的,那是一本好书 :) 我问这个问题是因为很遗憾,市面上有不少不太好的 JavaScript 书籍。 - Pointy
请问您能告诉我书的名字吗? - IMm0rtal
10个回答

79

在Javascript中,truefalse并不代表数字值。

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

在其他一些编程语言中(如Pascal、C#),有一个不是数值类型的独立布尔类型。虽然可以在布尔值和数值之间进行转换,但不会自动发生转换。

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

例如,即使数字不是布尔类型,也可以在期望布尔值的地方使用数字值。像if (1) {...}这样的代码与if (true) {...}一样有效。

在比较值时,就像在你的示例中一样,等号(==)运算符和全等号(===)运算符之间存在差异。等号(==)运算符会快乐地转换类型以找到匹配,因此1 == true计算结果为true,因为true被转换为1。全等号(===)类型运算符不进行类型转换,因此1 === true计算结果为false,因为值的类型不同。


1
如果像 1 这样的数字确实被转换为 true 进行比较,那么为什么 2 == true 也不会评估为 true 呢?为了证明当转换为布尔值时 2 也被视为 true!!2 == true 的结果为 true。 - user193130
2
@user193130:抱歉,答案中有误。当你比较它们时,转换是从布尔值到数字。true 被转换为 1,所以 1 == true 的结果为 true,而 2 == true 的结果为 false。当你将一个值用作条件时,转换必须是布尔类型,因为这是条件可以使用的唯一类型。 - Guffa
啊,这有道理。我刚测试了+true === 1,结果为真。 - user193130
1
我认为这很令人困惑,在JavaScript中,-1等于true!例如,如果您执行以下操作: if(str.indexOf("something")){ dosomething(); } 即使在str变量中未找到"something",它也会执行。 - McVitas
4
indexOf方法并不适合那样使用。即使将-1解释为false,如果字符串在第一个位置找到它仍然行不通。由于indexOf如果在第一个位置找到字符串则返回 0,所以它也会被解释为 false。你可以使用 if(str.indexOf("something") + 1),但这太晦涩了,最好还是使用 if(str.indexOf("something") != -1) 查找特殊值 -1 - Guffa
如果你不使用像 if (array.length) 而是使用 if (array.length > 0),那么你就是一个糟糕的程序员。 - Hal50000

44

在JavaScript中,==被称为“大概等于”。

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

如果想要进行真正的相等性比较,请使用===运算符。


3
实际上,它将整数转换为布尔值,然后进行比较,但思路正确。 - nonrectangular
@nonrectangular 刚刚确认它确实从布尔转换为整数; 请参见上面答案中的评论和João Silva下面的解释。 - user193130
实际上,== 检查的被称为“IsLooselyEqual”。 - IMm0rtal

15

尝试使用严格相等比较:

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

== 运算符会进行类型转换,而 === 运算符不会。


9
从ECMAScript规范第11.9.3 抽象相等比较算法节中得知:

比较x == y,其中x和y是值,会产生true或false。此类比较按以下方式执行:

  • 如果Type(y)为Boolean,则返回比较结果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

这回答了我的问题 - 布尔值会被转换为数字/数字会被转换为布尔值吗? 答案是 - 布尔值会被转换为数字 - coderpc

3
啊,可怕的宽松比较运算符又来了。永远不要使用它。相反,始终使用严格比较===或!==。
额外的知识: 0 == ''

为什么0 == ' ' 是 true?而 " " == "0" 是 false? - Ankita
@Ankita,这两个是相同类型的,即 " " == "0"。 - PonrajPaul

3

当将某个变量与布尔值进行比较时,会按照以下方式进行:

步骤1:将 boolean 转换为数字类型。例如:Number(true) // 1Number(false) // 0

步骤2:比较两侧的值。

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

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

true == 1
-> Number(true) === 1
-> 1 === 1
-> true

And (与)
true == 2
-> Number(true) === 1
-> 1 === 2
-> false

2
实际上,由于具有“实际值”,JavaScript中的每个对象都解析为true,正如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 的东西都很好懂 ;)


"并非所有 JavaScript 的语法都很合理" - 如果你理解类型转换,这个例子就很容易理解。 - BugBuddy

0

使用===来比较变量,而不是使用==

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

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

注意

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

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

给出不同的结果


0

从某种程度上来说,是的,它是1。

在Chrome控制台中尝试这些示例:

> 2==true
false

> 1==true
true

> true + 1
2

> true + 2
3

> true + true
2

所以,答案是:

  • 是的,只要您在任何算术上下文中使用true,它就被视为数字1,或者像李小龙所说的那样,它变成了1。同样地,false实际上是零。但是,

  • 不是的,如果您问Javascript它对true的看法,它会说它是一个布尔值:

> typeof true
'boolean'

在一种松散类型的语言中,有时事物并不是它们本身,而是你如何看待它们,这并不奇怪。如果你将true添加到一个字符串中,它不会添加1,而是作为一个字符串添加"true",因此从根本上讲,它绝不等同于一个数字。让我用一个可怕的双关语来结束这篇文章:

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


-1

使用 == 时,您基本上是比较变量在与 false 比较时是否为 falsey,在与 true 比较时是否为 truthy。如果使用 ===,它将比较变量的确切值,因此 true 将不等于 1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接