短路评估确定第一个值是否为假。如果是,则返回第二个值,如下所示:
var x = y || z; // if y is falsey return z
在使用短路评估而不诉诸if / else语句或三元运算符时,有没有办法忽略零值为假?
答案 0 :(得分:2)
您可以将您的号码包装到Number对象中并进行检查;
var x = new Number(0) || console.log("never gets printed");
console.log(parseInt(x));
//or
console.log(x.valueOf());

答案 1 :(得分:2)
您可以先检查y
是否不等于零,然后取数值并得到z
的默认值y
的结果。
x = +(y !== 0) && (y || z)
工作原理:
expression y part result result comment ---------------------- --------- ----------- ------ ---------------------------- +(y !== 0) && (y || z) complete expression +(y !== 0) 0 0 0 result found, omit next part because of falsy value +(y !== 0) 1 1 check next part 1 && (y || z) y y take y, omit default +(y !== 0) undefined 1 check next part 1 && (y || z) z z take z as default
function x(y, z) {
return +(y !== 0) && (y || z);
}
console.log(x(0, 42)); // 0
console.log(x(4, 42)); // 4
console.log(x(undefined, 42)); // 42
console.log(x(0, null)); // 0
console.log(x(4, null)); // 4
console.log(x(undefined, null)); // null
console.log(x(0, 0)); // 0
console.log(x(4, 0)); // 4
console.log(x(undefined, 0)); // 0
.as-console-wrapper { max-height: 100% !important; top: 0; }
答案 2 :(得分:1)
修改强>
如果z
是一个数字,你可以使用这样的技巧:
var x1 = Number(y===0 && '0' || y || z)
// or
var x2 = (y===0 && '0' || y || z)-0
var z = -1;
var y = 42;
var x = y || z;
var x1 = Number(y===0 && '0' || y || z)
var x2 = (y===0 && '0' || y || z)-0
console.log('x:',x, ' x1:',x1, ' x2:',x2);
var y = 0;
var x = y || z;
var x1 = Number(y===0 && '0' || y || z)
var x2 = (y===0 && '0' || y || z)-0
console.log('x:',x, ' x1:',x1, ' x2:',x2);
var y = null;
var x = y || z;
var x1 = Number(y===0 && '0' || y || z)
var x2 = (y===0 && '0' || y || z)-0
console.log('x:',x, ' x1:',x1, ' x2:',x2);

原始回答:
也许简单的方法可以工作(3当量)
var x = (y === 0) ? 0 : (y || z);
var x = (!y && y!==0) ? z : y;
var z = 'Was falsey';
var y = 42;
var x = y || z;
var x1 = (y === 0) ? 0 : (y || z);
var x2 = (!y && y!==0) ? z : y;
console.log('x:',x, 'x1:',x1, 'x2:',x2);
var y = 0;
var x = y || z;
var x1 = (y === 0) ? 0 : (y || z);
var x2 = (!y && y!==0) ? z : y;
console.log('x:',x, 'x1:',x1, 'x2:',x2);
var y = null;
var x = y || z;
var x1 = (y === 0) ? 0 : (y || z);
var x2 = (!y && y!==0) ? z : y;
console.log('x:',x, 'x1:',x1, 'x2:',x2);

答案 3 :(得分:0)
编辑:这使用三元运算符,如果这不是你想要的,请不要使用它。
当然,这是另一种简单的方法:
var x = y || y==0?0:z;
如果
y
真实,则x
设置为y
如果
y
是假的,y==0
,则x
设置为0
如果
y
是假的,y!=0
,则x
设置为z
;
答案 4 :(得分:0)
您可以使用bitwise NOT Javascript运算符~
将0
转换为-1
(它会反转数字的位)。您可以想象它将-1
转换回0
,这将是唯一可能的假值。像undefined
,NaN
或''
这样的常见虚假对象会变得真实,可能会或可能不是您想要的。
您的代码将如下所示:
var x = ~y || z;