在短路评估中允许零值

时间:2017-08-23 12:05:38

标签: javascript

短路评估确定第一个值是否为假。如果是,则返回第二个值,如下所示:

var x = y || z; // if y is falsey return z

在使用短路评估而不诉诸if / else语句或三元运算符时,有没有办法忽略零值为假?

5 个答案:

答案 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,这将是唯一可能的假值。像undefinedNaN''这样的常见虚假对象会变得真实,可能会或可能不是您想要的。

您的代码将如下所示:

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