Javascript逻辑运算符| |将0读取为假值。有什么好办法吗?
对不起,我对javascript有点不在行。但我的问题是: 当输入0时,以下函数返回-1Javascript逻辑运算符| |将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
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;
}