[英]Allow for zero-value in short-circuit evaluation
短路评估确定第一个值是否为假。 如果是这样,则返回第二个值,如下所示:
var x = y || z; // if y is falsey return z
使用短路评估时,是否可以不使用if / else语句或三元运算符而将零值视作虚假?
您可以先检查y
是否不等于零,然后取数值并为y
获取z
的默认结果。
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) yy take y, omit default +(y !== 0) undefined 1 check next part 1 && (y || z) zz 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; }
您可以将数字包装到Number对象中并进行检查;
var x = new Number(0) || console.log("never gets printed"); console.log(parseInt(x)); //or console.log(x.valueOf());
编辑:
如果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);
编辑:这使用三元运算符,因此,如果这不是您要查找的内容,请不要使用它。
当然,这是另一种简单的方法:
var x = y || y==0?0:z;
如果
y
为真,则x
设置为y
如果
y
为假,且y==0
,则x
设置为0
如果
y
为假,且y!=0
,则x
设置为z
;
您可以使用按位NOT NOT Javascript运算符~
将0
转换为-1
(它会将数字的位取反)。 可以想象,它将-1
转换回0
,这将是唯一可能的falsey值。 诸如undefined
, NaN
或''
类的常见虚假对象将变为true,可能不是您想要的。
您的代码将如下所示:
var x = ~y || z;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.