Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/430.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript逻辑运算符| |将0读取为假值。有什么好办法吗?_Javascript_Operator Keyword - Fatal编程技术网

Javascript逻辑运算符| |将0读取为假值。有什么好办法吗?

Javascript逻辑运算符| |将0读取为假值。有什么好办法吗?,javascript,operator-keyword,Javascript,Operator Keyword,对不起,我对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

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

你能得到的最紧的回报就是把你的if-else折叠成一个单一的回报,一个la:

return bar === 0 ? bar : (bar || -1);
因为| |比较truthy/falsy值,所以必须显式地(使用强类型)处理
0
大小写


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

您可以使用三元运算符重写foo,如下所示:

function foo(bar) {
    return bar === 0 ? 0 : (bar || -1)
}
三元运算符的语法是
条件?expr1:expr2
。如果
条件
为真,它将返回
expr1
,否则它将返回
expr2


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

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

好吧,这个
if
的目的是检查缺失(不存在)的值。在JavaScript中,如果值为:

  • 未定义
  • null
  • 检查
    未定义
    的最佳方法是严格(==)检查其类型是否与“未定义”字符串相等-如果无法计算
    ,则不会出现异常

    但是,如果表达式不是
    未定义的
    ,则可以通过比较
    bar===null
    安全地检查其值


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

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

    function foo(bar){
        if (arguments.length === 0) {
          return -1;
        }
        return bar;
    }
    

    如果
    bar===0
    ,则返回true。这肯定是发布的最“优雅”的解决方案。我尝试了此方法,但函数现在在输入0时返回true。在什么情况下,您希望获得
    -1
    ?falsy值是
    未定义的
    空的
    假的
    +0
    -0
    NaN
    。我不知道为什么会被否决。真实和虚假的价值观在JS中是一个复杂的主题。此外,OP为他们的问题创建了一个非常简洁的示例来演示他们的问题。
    foo(无穷大)
    你期望得到什么结果?@sumneevans我没有投反对票,但是,这个问题非常具体,它会发出强烈的“X-Y”氛围。一个单独的例子总是一个好主意,如果OP也能说明达到了实际目的,这可能会很有帮助,这样他就可以在实际问题上得到帮助,而不是试图解决问题。@Oriol很抱歉,我不知道+0或-0的概念存在(我对编程比较陌生)。我将把问题改为注意,我专门寻找值为0的案例(并非所有falsy值),以便其他人可以使用该问题作为参考。我喜欢三元的解释!也许将“true”改为“truthy”会有好处,以便更清楚地了解
    true?a:b和
    1?a:b
    都会导致
    a
    ?谢谢你的回答!谢谢你的回答!我认为这是最好的代码,但是解释一下为什么会有帮助。好吧,如果
    是为了检查缺少的(不存在的)值,那么这个
    。在JavaScript中,如果值为:1)
    undefined
    2)
    null
    ,则该值将丢失。检查
    undefined
    的最佳方法是严格(==)检查其类型是否与“undefined”字符串相等-如果无法计算
    bar
    ,则不会出现异常。但是,如果表达式不是未定义的
    ,则可以通过比较安全地检查其“值`bar===null”。因此,我们涵盖了这两种情况,没有例外。
    function foo(bar){
        if (arguments.length === 0) {
          return -1;
        }
        return bar;
    }