54

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

它开始于:

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

但是,我观察到以下内容:

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

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

但是,真相是什么?

4

9 回答 9

74

确实,true并且false不代表 Javascript 中的任何数值。

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

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

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

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

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

于 2012-09-02T13:31:47.767 回答
43

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

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

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

于 2012-09-02T13:22:33.453 回答
14

尝试严格的相等比较:

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

==运算符会从一种类型转换为另一种类型,而运算===符则不会。

于 2012-09-02T13:21:04.207 回答
9

来自 ECMAScript 规范,第11.9.3 节抽象相等比较算法

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

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

因此, in, if (1 == true),true被强制转换为 a Number,即Number(true),这导致 的值1,产生最终if (1 == 1)结果是true

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

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

11.9.6 严格等式比较算法

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

  • 如果 Type(x) 与 Type(y) 不同,则返回false
于 2012-09-02T14:14:39.197 回答
3

啊,可怕的松散比较运算符又来了。永远不要使用它。始终使用严格比较,=== 或 !== 代替。

奖金事实:0 == ''

于 2012-09-02T13:21:32.467 回答
3

当将某些东西与布尔值进行比较时,它的工作原理如下

第 1 步:转换booleanNumber Number(true) // 1Number(false) // 0

第 2 步:比较双方

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

如果1和你2比较true会得到以下结果

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

true == 2
-> Number(true) === 1
-> 1 === 2
-> false
于 2018-11-03T14:06:58.857 回答
2

实际上,如果 javascript 中的每个对象都像 W3Cschools 所说的那样具有“真正的价值”,它就会解析为 true。这意味着除"", NaN,或undefined之外的所有内容。null0

用运算符测试一个数字与布尔值==确实有点奇怪,因为布尔值在比较之前被转换为数字 1,这有点违背定义背后的逻辑。当您执行以下操作时,这会变得更加混乱:

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

并非 javascript 中的所有内容都很有意义;)

于 2015-01-22T01:17:52.920 回答
0

用于===使变量相等,而不是==.

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

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

注意如何

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

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

给出不同的结果

于 2012-09-02T13:23:21.813 回答
-1

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

于 2012-09-02T13:25:55.097 回答