【问题标题】:falsy expressions with double equals带有双等号的虚假表达式
【发布时间】:2019-04-29 07:37:05
【问题描述】:

为什么会出现以下代码:

var foo=10;
foo==true //false

返回假?不应该是真的,因为任何数字都是真的?

【问题讨论】:

  • 以前在这里回答过:stackoverflow.com/a/12236341/1024832。要点是true 转换为1。要将数字强制转换为布尔值,您可以像这样将其加倍:!!foo==true

标签: javascript


【解决方案1】:

这是一个上下文问题。如果foo 已按照您的代码进行初始化

var foo = 10;

然后

if (foo) alert("it's true!");

将触发 alert(),因为在这种情况下,if 测试只是变量的值,即“真实”值 10。

但是,比较 foo == true 是一个不同的上下文:它是“抽象”相等操作。在那里,数字和布尔值之间的比较首先强制将布尔值转换为数字。根据定义,这会将true 变为 1。然后进行比较,10显然不等于1。

很少有理由明确地将表达式值与truefalse 进行比较。如果您想查看一个值是否“真实”(您知道的值是数字,但您不知道 exact 值),您可以获得与if 测试相同的结果会得到:

var isTruthy = !!foo;

这会将! 布尔补码运算符两次 应用于foo 的值。第一个应用程序首先将 10 转换为 true,然后将其反转为 false。第二个应用程序将false 转换回true,因此isTruthy 的值将是true

【讨论】:

    【解决方案2】:

    在您的比较中,true 变成了1,因为foo 是一个数字。
    检查此示例 sn-p:

    var foo = 10;
    console.log("foo: " + foo);
    console.log(foo==true);
    
    var foo = 1;
    console.log("foo: " + foo);
    console.log(foo==true);

    您可能还想了解严格比较,这将防止数字和布尔值之间的比较返回 true 值:

    var foo = 1;
    console.log("foo: " + foo);
    console.log("Regular comparison: " + (foo==true));
    console.log("Strict comparison: " + (foo===true));

    Link to “Comparison_Operators”

    【讨论】:

      猜你喜欢
      • 2022-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 1970-01-01
      • 2020-03-09
      • 1970-01-01
      相关资源
      最近更新 更多