2017-08-23 13 views
7

短絡評価は、最初の値が偽であるかどうかを判断します。その場合は、次のように、第2の値を返す:短絡評価でゼロ値を許可する

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

は、if/else文または三元事業者に頼ることなく短絡評価を使用した場合falseyあるとして、ゼロの値を無視することがある方法ですか?

+3

はそうは思わないでください。 –

答えて

2

Numberオブジェクトに数値をラップして、それをチェックすることができます。

var x = new Number(0) || console.log("never gets printed"); 
 
console.log(parseInt(x)); 
 
//or 
 
console.log(x.valueOf());

+0

ニースの条件なし回答。これはOPが探していたものと思われる。 – clabe45

+0

ですが、 'var x = new Number(null)|| console.log( "決して印刷されません"); '、' '決して印刷されない' '印刷されない' 'の代わりに' 0'と '0'も表示されます' – NatNgs

1

EDIT:

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);

zが数値である場合は、多分、このようなトリックを使用することができます

オリジナルの答え:

たぶん簡単な方法は(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);

+0

Opは三項を言っていません – user7951676

+0

ああ、三元無しでサンプルを追加! – NatNgs

0

編集作業することができます:これは三項演算子を使用して、そこらそれがあなたのものではないなら、探して、これを使用しないでください。もちろん

が、これはそれを行うには、別の簡単な方法です:yがtruthyある

var x = y || y==0?0:z; 

場合なら、xy

に設定されているyはfalsyあり、その後、y==0x0

yが偽であり、y!=0の場合、xzに設定されます。

+0

'? : '三位一体?彼は、もしかしたら、三分の一を使わずに言った。 –

+0

@JaykumarGondaliya真実...しかし、これを行う方法は非常に少ない。 – clabe45

0

あなたは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)    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; }

関連する問題