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

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

开头是:

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

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

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

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

但是,真相是什么?

【问题讨论】:

标签: javascript type-conversion


【解决方案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
        

        【讨论】:

          猜你喜欢
          • 2015-11-11
          • 2017-02-21
          • 2014-10-14
          • 1970-01-01
          • 2021-07-10
          • 1970-01-01
          • 1970-01-01
          • 2012-09-12
          相关资源
          最近更新 更多