2017-08-23 11 views
7

Ocena zwarcia określa, czy pierwsza wartość to falsey. Jeśli tak, to powrót drugą wartość, co następuje:Pozwolić na wartość zerową w ocenie zwarcia

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

Czy istnieje sposób aby pominąć zerowej wartości jako falsey podczas korzystania ocenę zwarciem bez uciekania się do if/else oświadczeń lub operatorów trójskładnikowych?

+3

Nie sądzę. –

Odpowiedz

2

Możesz zawinąć swój numer do obiektu Numer i to sprawdzić;

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

+0

Przyjemna odpowiedź bez warunku. Wygląda na to, czego szukał OP. – clabe45

+0

, ale jeśli zrobisz "var x = new Number (null) || console.log ("nigdy nie zostanie wydrukowane"); ', które wypisze' 0' i '0' również zamiast logować' "nigdy nie zostanie wydrukowane" ' – NatNgs

1

EDIT:

Jeśli z jest liczbą, można użyć trick może tak:

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

Oryginalny odpowiedź:

Może prosty sposób można pracować (3 równoważniki)

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 powiedział, że nie ma ternarys – user7951676

+0

Ach, masz rację, mój błąd; dodać próbkę bez trójskładnikowego, więc! – NatNgs

0

Edit: ten wykorzystuje operator potrójny, więc jeśli to nie jest to, co ty " szukam, nie korzystaj z tego.

Oczywiście jest to kolejny prosty sposób to zrobić:

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

jeśli y jest truthy, następnie x jest ustawiony na y

jeśli y jest falsy i y==0, następnie x jest ustawiony na 0

jeśli y to falsy, a y!=0, a następnie x jest ustawione na z;

+0

'? : 'ternarys ?? powiedział bez niego, czy ternarys –

+0

@JaykumarGondaliya True ... ale jest bardzo mało sposobów, aby to zrobić. – clabe45

0

Można najpierw sprawdzić czy y jest nierówna zeru i mieć wartość liczbową i uzyskać wynik niewypłacalności z dla y.

x = +(y !== 0) && (y || z) 

Jak to działa:

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

Powiązane problemy