JavaScript逻辑运算符||将0视为false值。有没有一种好的方法来解决这个问题?

3
抱歉,当涉及到JavaScript时,我有点新手。但是这是我的问题: 当输入0时,以下函数返回-1。
function foo(bar){
    return bar || -1;
}

foo(0);

有没有一种简洁优雅的方法来允许||操作符将0(特指0,而不是所有falsy值)作为有效值读取,以便函数返回0?还是我必须这样做:

function foo(bar){
    if(bar === 0){
        return 0;
    } else {
        return bar || -1;
    }

}

foo(0);

编辑:

感谢大家的回答!对于那些想知道的人,这个问题是为了寻找可选参数相同问题的解决方案而提出的。以下代码是应用示例。

function Point(x,y,meta){    //meta is an optional parameter. In this case I wanted to set meta to 0, but it was being set to null.
    this.x = x;
    this.y = y;
    //this.meta = meta || null; This line is the old code that would set meta to null when 0 is inputed.
    this.meta = meta === 0 ? 0 : (meta || null);    //the fix suggested by many users is applied here.
};

var foo = new Point(1,2,0);
console.log(foo.meta); //foo.meta is now 0 instead of null!

1
在什么情况下你想要获得 -1 呢?假值包括 undefined, null, false, +0, -0, NaN, "" - Oriol
1
就记录而言,我不知道为什么会被投票降低。在JS中,真值和假值是一个复杂的主题。此外,楼主创建了一个非常简洁的示例来展示他们的问题。 - Sumner Evans
foo(Infinity) 这里你期望得到什么输出? - Willem D'Haeseleer
1
@SumnerEvans 我没有点踩,但是这个问题非常具体,给人一种“X Y”的感觉。虽然一个孤立的例子总是一个好主意,但如果OP也能说明他的实际意图,那么这将会很有帮助,这样他就可以得到针对他实际问题的帮助,而不是他尝试的解决方案。 - Willem D'Haeseleer
@Oriol 对于造成的困惑我感到抱歉,我不知道+0或-0的概念(我在编程方面相对较新)。我将更改问题说明,以便注明我特别寻找值为0的情况(而不是所有虚假值),以便其他人可以将该问题用作参考。 - Lots o Sheeps
显示剩余2条评论
5个回答

1
你可以将if-else语句缩减为单个return语句,如下所示:

return bar === 0 ? bar : (bar || -1);

因为 || 操作符比较真值/假值,所以你必须明确处理(使用强类型)0 的情况。
从你的问题中很难判断,但通常当我覆盖比较的真值/假值性质时,是为了设置默认值。在这种情况下,它是用于检测函数是否被给定未定义的值,并在其位置上使用一些合理的默认值。

3
如果 bar === 0,则返回真。 - Sumner Evans
这绝对是发布的最“优雅”的解决方案。 - Luke Taylor
我尝试过这个,但是当输入0时,该函数现在返回true。 - Lots o Sheeps

1
您可以使用三元运算符重写 foo,如下所示:
function foo(bar) {
    return bar === 0 ? 0 : (bar || -1)
}

三元运算符的语法是 condition ? expr1 : expr2。如果 condition 为真,它将返回 expr1,否则它将返回 expr2

这里有更多关于三元运算符的信息


我喜欢三元运算符的解释!也许将“true”更改为“truthy”会更清晰一些,以便于理解true ? a : b1 ? a : b都会得到a的结果? - Dawson Toth

1
那就是JavaScript的工作方式。所有的值都是真值或假值。零恰好是一个假值。你可以使用三元运算符来简化函数。
function foo(bar) {
    return bar === 0 ? 0 : (bar || -1);
}

1
function foo(bar){
    return typeof bar === "undefined" || bar === null ? -1 : bar;
}

foo(0); // should give 0
foo(false); // should give false
var a; //  undefined variable 
foo(a); // should give -1
foo(null); // should give -1
var b = {}; // object
foo(b.a); // should give -1 (undefined property)

好的,这个if的意图是检查缺失(不存在)的值。在JavaScript中,如果值为以下情况,则表示缺失:

  1. undefined
  2. null

检查某个值是否为undefined的最佳方法是严格(===)检查其类型是否与"undefined"字符串相等 - 这样,如果无法评估bar,就不会出现异常。

但是,如果您的表达式不是undefined,那么您可以使用比较bar === null安全地检查其值。

因此,我们涵盖了两种情况,并且不会出现异常。


我认为这是最好的代码,但解释一下为什么会更有帮助。 - recursive
好的,这个 if 的意图是检查缺失(不存在)的值。在 JavaScript 中,如果值为: 1)undefined 2)null则该值将被视为缺失。检查某个值是否为 undefined 的最佳方法是严格(===)检查其 类型 是否等于 "undefined" 字符串 - 这样,如果无法评估 bar,您就不会得到异常。 但是,如果您的表达式不是 undefined,那么您可以使用比较 bar === null 安全地检查其值。 因此,我们涵盖了两种情况,并且不会出现异常。 - Stanislav Karakhanov

1
另一种方法是查看接收到的参数数量并设置相应的 default 值。
function foo(bar){
    if (arguments.length === 0) {
      return -1;
    }
    return bar;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接