Javascript逻辑运算符||将0读取为假值.有什么好办法解决这个问题吗
Javascript logical operator || reads 0 as a false value. Is there a NICE way around this?
对不起,我对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中,如果值为:,则该值将丢失
undefined
null
检查undefined
的最佳方法是严格(==)检查其类型是否等于"未定义"字符串-这样,如果无法评估bar
,就不会出现异常。
但是,如果您的表达式不是undefined
,则可以使用比较bar===null
安全地检查其"值"。
因此,我们涵盖了这两种情况,没有例外。
- 如何解决Yii中的页面刷新问题
- 简单的ES6承诺问题-交换解决和拒绝参数
- 为什么不'我的窗口滚动事件根本没有启动.其他答案没有解决问题
- jQuery通过步骤的自排队循环来解决延迟问题
- 当服务器从 http 更改为 https 时,有哪些可能的方法可以解决问题
- 如何使用共享按钮将所有内容对齐到一行来解决问题
- 使用 unity,我的 js 文件无法解决问题
- 缺少 iframe ie8.相对定位不能解决问题
- 如何删除给定字符串中的 CRLF 以解决问题
- 为什么 标记将空格替换为 %2520?如何解决问题
- 使用javascript使用算法解决问题
- 请解决问题在我的AJAX脚本的联系形式
- Angular Js ->UI -路由->解决问题
- 运动:rna转录.正在努力解决问题
- JQuery addClass不透明度函数淡入图像-解决问题
- 如何通过程序解决问题
- JavaScript Promise在解决问题时陷入困境
- Chrome文件夹上传API.检测支持&使用JS/JQuery解决问题
- Angular js :$q解决问题
- 由于Node的异步特性,需要帮助解决问题