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

Posted

技术标签:

【中文标题】JavaScript 中是 true == 1 和 false == 0 吗?【英文标题】:Is true == 1 and false == 0 in JavaScript? 【发布时间】:2012-08-27 12:09:50 【问题描述】:

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

开头是:

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

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

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

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

但是,真相是什么?

【问题讨论】:

Possible duplicate 另一个非常接近的问题(尽管来自@Jeroen 的问题有更好的答案):***.com/questions/8265401/… 我们在这里谈论的是哪本“好书”? @Pointy 它的 Wrox 专业 JavaScript 【参考方案1】:

尝试严格相等比较:

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

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

【讨论】:

【参考方案2】:

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

奖励事实:0 == ''

【讨论】:

为什么 0==' ' 是真的?而 " "=="0" 是假的? @Ankita,这里都是同一类型 " " == "0"【参考方案3】:

在 JavaScript 中,== 读作“可能等于”。

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

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

【讨论】:

其实就是把Integer转成Boolean,然后比较,但是思路不错。 @nonrectangular 刚刚确认它实际上是从布尔值转换为整数;请参阅上面答案中的 cmets 以及下面的 João Silva's explanation。【参考方案4】:

使用=== 代替== 来等同变量。

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

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

注意如何

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

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

给出不同的结果

【讨论】:

【参考方案5】:

使用 == 您实际上是在比较变量与 false 比较时是否为 false 或与 true 比较时是否为 true。如果你使用 ===,它将比较变量的确切值,所以 true 不会 === 1

【讨论】:

【参考方案6】:

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

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

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

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

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

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

【讨论】:

如果像1 这样的数字确实被转换为true 进行比较,那么为什么2 == true 也不评估为true?为了证明2 在转换为布尔值时也被视为true!!2 == true 的计算结果为真。 @user193130:对不起,答案有误,当您比较它们时,转换是从布尔值到数字。 true 被转换为1,所以1 == true 的计算结果为真,而2 == true 的计算结果为假。当您使用值作为条件时,必须转换为布尔值,因为这是条件可以是唯一的类型。 嗯,有道理。刚刚测试了+true === 1,结果为真。 我认为这很令人困惑,在 JavaScript 中 -1 等于 true!例如,如果你这样做 if(str.indexOf("something")) dosomething();即使在 str 变量中找不到“某物”,它也会这样做。 @McVitas:indexOf 方法不适合那样使用。即使-1 被解释为false,如果在第一个位置找到该字符串也不会起作用。因为indexOf 返回0,如果在第一个位置找到字符串,那也将被解释为false。您可以使用if(str.indexOf("something") + 1),但这很模糊,最好使用if(str.indexOf("something") != -1) 查找特殊值-1【参考方案7】:

来自 ECMAScript 规范,11.9.3 The Abstract Equality Comparison Algorithm 部分:

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

如果 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 The Strict Equality Comparison Algorithm

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

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

【讨论】:

这回答了我的问题 - Boolean 会被转换为 Number / Number 会被转换为 Boolean 吗?答案是 - Boolean 被转换为 Number【参考方案8】:

实际上,如果 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 中的所有内容都很有意义 ;)

【讨论】:

“并非 javascript 中的所有内容都有意义” - 如果您了解类型强制,则此示例非常有意义。【参考方案9】:

当与布尔值比较时,它的工作原理如下

第 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 中是 true == 1 和 false == 0 吗?的主要内容,如果未能解决你的问题,请参考以下文章

js中的真值和假值

javascript 作用域

变量范围在 Mocha 测试框架中是如何工作的?

为啥 -1**2 在 JavaScript 中是语法错误?

和 " " 以及没有引号在 Javascript 中是啥意思?

_external=True 在 flask_mail 中是啥意思?