繁体   English   中英

在短路评估中允许零值

[英]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值。 诸如undefinedNaN''类的常见虚假对象将变为true,可能不是您想要的。

您的代码将如下所示:

var x = ~y || z;
  • 〜(-2)等于1
  • 〜(-1)等于0
  • 〜(-0)等于-1
  • 〜(0)等于-1
  • 〜(1)等于-2

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM