题 JavaScript中是true == 1和false == 0吗?


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

它始于:

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

但是,我观察到以下情况:

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

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

但那么,真相是什么?


38
2017-09-02 13:18


起源


可能重复 - Jeroen
另一个非常接近的问题(虽然来自@Jeroen的问题有更好的答案): stackoverflow.com/questions/8265401/... - apsillers
我们在这里谈论哪本“好书”? - Pointy
@Pointy其Wrox专业JavaScript - Mahesha999
@ Mahesha999好的,这是一本好书:)我问,因为遗憾的是,有很多不那么好的JavaScript书籍。 - Pointy


答案:


这是真的 true 和 false 不代表Javascript中的任何数值。

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

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

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

例如,虽然数字不是布尔值,但您可以使用期望布尔值的数值。运用 if (1) {...} 同样有效 if (true) {...}

比较值时,如在您的示例中,之间存在差异 == 操作员和 === 运营商。该 == 等式运算符愉快地在类型之间转换以找到匹配,所以 1 == true 评估为真,因为 true 转换为 1。该 === 类型相等运算符不进行类型转换,所以 1 === true 计算结果为false,因为值的类型不同。


53
2017-09-02 13:31



如果数字如 1 确实转变为 true 为了比较,那么为什么不 2 == true 还评价为真吗?证明这一点 2 也被认为 true 当转换为布尔值时 !!2 == true 评估为真。 - user193130
@ user193130:对不起,这是答案中的一个错误,当你比较它们时,转换是从布尔值到数字。该 true 转换为 1所以 1 == true 评估为真,而 2 == true 评估为假。当您使用值作为条件时,转换必须是布尔值,因为这是条件可以的唯一类型。 - Guffa
啊,这是有道理的。刚刚测试过 +true === 1 它评估为真。 - user193130
而且我觉得这很混乱,在JavaScript中-1等于true!例如,如果你这样做(str.indexOf(“something”)){dosomething();即使在str变量中找不到“某些东西”也是如此。 - McVitas
@McVitas:The indexOf 方法并不意味着以这种方式使用。即使 -1 被解释为 false,如果在第一个位置找到字符串,它将无法工作。如 indexOf 回报 0 如果在第一个位置找到该字符串,那么该字符串也将被解释为 false。你可以用 if(str.indexOf("something") + 1),但这很晦涩,最好只寻找特殊价值 -1 运用 if(str.indexOf("something") != -1)。 - Guffa


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

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

要获得真正的相等性,请使用===运算符。


39
2017-09-02 13:22



实际上,它将整数转换为布尔值,然后比较,但正确的想法。 - nonrectangular
+1可能等于 - Chris
@nonrectangular刚刚确认它实际上是从布尔值转换为整数;请参阅上面的答案中的评论 JoãoSilva的解释 下面。 - user193130
@ user193130谢谢!看起来你是对的。 - nonrectangular


尝试严格的相等比较:

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

== 运算符确实从一种类型转换为另一种类型 === 运营商没有。


12
2017-09-02 13:21





从ECMAScript规范,Section 11.9.3抽象等式比较算法

比较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

使用strict equals运算符时不会发生这种情况 === 代替:

11.9.6严格的等式比较算法

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

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

7
2017-09-02 14:14



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


啊,这个可怕的松散比较操作员再次罢工。永远不要使用它。始终使用严格的比较,===或!==。

奖金事实: 0 == ''


3
2017-09-02 13:21



为什么0 ==''是真的?而“”==“0”是假的? - Ankita
@Ankita,这两个都是同一类型“”==“0” - PonrajPaul


实际上,如果它具有W3Cschools所说的“真正价值”,javascript中的每个对象都会解析为true。这意味着一切除外 ""NaNundefinednull 要么 0

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

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

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


1
2018-01-22 01:17





使用 === 将变量等同于而不是 ==

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

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

注意如何

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

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

给出不同的结果


0
2017-09-02 13:23





使用==你基本上比较一个变量是否为false,在比较false或truthey时与true进行比较。如果你使用===,它将比较变量的确切值,所以true不会=== 1


0
2017-09-02 13:25