【问题标题】:if var a = true then a == 1 is true but a == 2 is false. Why? [duplicate]如果 var a = true 则 a == 1 为真,但 a == 2 为假。为什么? [复制]
【发布时间】:2018-02-07 09:56:58
【问题描述】:

如果var a = true 那么a == 1truea == 2false。为什么?我知道在 javascript 布尔表达式中,0 转换为 false,1 转换为 true。但是其他整数呢。为什么会出现上述行为?

【问题讨论】:

  • 所有非零值都不为假,但true不能是任何非零值,它必须是单个值。

标签: javascript


【解决方案1】:

为什么?我知道在 javascript 布尔表达式中 0 强制转换为 false 和 1 转换为 true。

因为Number(true) => 1

根据spec of abstract equality expression evaluation

  1. 如果 Type(x) 是 Boolean,则返回比较结果 ToNumber(x) == y。

因此a首先被强制转换为数字,然后与 1 进行比较。

【讨论】:

    【解决方案2】:

    在js中使用==或!=时,操作数会先转换为相同类型再进行比较。转换时:

    如果有布尔值,则true转为1,false转为0;

        var a = true;
        a == 1;// a turned to 1 before compare,so true
        a == 2;// a turned to 1 before compare,so false
    

    【讨论】:

    • "强制重组" - wat?
    • 被强制转换为相同类型,我用谷歌翻译,,,已经更新,英文不是goog,很抱歉
    【解决方案3】:

    这与强制有关。在a == 1 场景中,a 被强制转换为整数以再次比较 1,true 被强制转换为 1。在第二个示例中,a 再次被强制转换为 1,因此它不等于 2

    Further reading on coercion

    【讨论】:

      【解决方案4】:

      您可以将1 转换为TrueTrue 转换为1,但您不能将其他数字转换为True

      【讨论】:

        【解决方案5】:

        这可能是从二进制世界继承而来的,这是有道理的,因为在二进制中,0 为假,1 为真。没错,这就是 javascript 在比较时对布尔类型进行类型转换的方式。

        对于布尔值,只有两种可能,truefalse。因此,在数字/二进制系统中,0 和 1 很容易代表它们。

        【讨论】:

          【解决方案6】:

          好吧,因为 0 = 假,1 = 真。布尔值只有两个值:真/假。那么 2 应该是什么?

          var 没有类型,它可以是一切。另请考虑 == 与 === 运算符。

          var x = 1;
          console.log(x === true);
          console.log(x == true);
          x = 2;
          console.log(x === true);
          console.log(x == true);
          x = 0;
          console.log(x === false);
          console.log(x == false);
          x = -1;
          

          查看示例:http://jsfiddle.net/2aqGS/146/

          【讨论】:

            猜你喜欢
            • 2011-12-04
            • 1970-01-01
            • 2020-05-04
            • 1970-01-01
            • 2019-07-31
            • 1970-01-01
            • 2012-03-31
            • 1970-01-01
            • 2023-04-04
            相关资源
            最近更新 更多