Javascript逻辑运算符||将0读取为假值.有什么好办法解决这个问题吗

Javascript logical operator || reads 0 as a false value. Is there a NICE way around this?

本文关键字:解决 问题 什么 逻辑运算符 读取 Javascript      更新时间:2023-09-26

对不起,我对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!

这就是JavaScript的工作方式。所有的价值观要么是真的,要么是假的。零恰好是一个错误的值。不过,您可以使用三元函数来简化函数。

function foo(bar) {
    return bar === 0 ? 0 : (bar || -1);
}

你能得到的最严格的方法是将你的if-else折叠成一个单一的返回,一个la:

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

因为||比较truthy/falsy值,所以必须显式处理(使用强类型)0情况。

很难从你的问题中判断出来,但通常当我忽略比较的真实性/虚假性时,我会默认一个值。在这种情况下,它检测我的函数是否被赋予了一个未定义的值,并在它的位置使用一些合理的默认值。

您可以使用三元运算符像这样重写foo

function foo(bar) {
    return bar === 0 ? 0 : (bar || -1)
}

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

以下是关于三元运算符的更多信息

另一种方法是查看接收到的参数数量,并以此方式设置default值。

function foo(bar){
    if (arguments.length === 0) {
      return -1;
    }
    return bar;
}
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的最佳方法是严格(==)检查其类型是否等于"未定义"字符串-这样,如果无法评估bar,就不会出现异常。

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

因此,我们涵盖了这两种情况,没有例外。