2016-01-30 12 views
5

Ich muss beide Seiten einer && Anweisung ausführen, aber dies wird nicht passieren, wenn der erste Teil false zurückgibt. Beispiel:Wie vermeidet man Kurzschlüsse in JavaScript?

function checkSomething(x) { 
    var not1 = x !== 1; 
    if (not1) doSomething(x); 

    return not1; 
} 

function checkAll() { 
    return checkSomething(1) 
     && checkSomething(3) 
     && checkSomething(6) 
} 

var result = checkAll(); 

Das Problem hierbei ist, dass doSomething(x) sollte zweimal durchgeführt werden, sondern weil checkSomething(1) kehrt false, die anderen Kontrollen werden nicht genannt werden. Was ist der einfachste Weg, alle Prüfungen auszuführen und das Ergebnis zurückzugeben?

Ich weiß, ich könnte alle Werte in Variablen speichern und diese anschließend überprüfen, aber das sieht nicht sehr sauber aus, wenn ich viele Prüfungen habe. Ich suche nach Alternativen.

+5

'Ich weiß, dass ich alle Werte in Variablen speichern können und diejenigen, überprüfen subsequently' Sie bereits die Antwort wissen, ist es leider nicht sehr hübsch, wie du sagst. –

+0

'return [checkSomething (1), checkSomething (2), checkSomething (3)];' ??? –

+0

In ES6 können Sie 'return [checkSomething (1), checkSomething (2), checkSomething (3)]. All (a => a);'. – Xufox

Antwort

5

Sie können das Vergleichsergebnis multiplizieren und es in Boolean umwandeln.

function checkSomething(x) { 
 
    var not1 = x !== 1; 
 
    if (not1) alert(x); 
 
    return not1; 
 
} 
 

 
function checkAll() { 
 
    return !!(checkSomething(1) * checkSomething(2) * checkSomething(3)); 
 
} 
 

 
document.write(checkAll());

Oder einige Array-Verfahren nehmen:

function checkAll() { 
    return [checkSomething(2), checkSomething(2), checkSomething(3)].every(Boolean); 
} 
+1

Warum würden Sie multiplizieren, wenn Sie den Operator '&' verwenden könnten? So würde es immer noch als "etwas UND etwas und etwas" lesen ... – nnnnnn

+0

@nnnnnn, dann hätte ich http://StackOverflow.com/A/35101081/1447675 –

+0

dann verwenden Sie ein bitweises oder '|' – Thomas

8

Verwenden Sie eine einzelne &. Das ist ein bitweiser Operator. Es führt alle Bedingungen aus und gibt dann eine bitweise Summe der Ergebnisse zurück.

function checkAll() { 
    return checkSomething(1) 
     & checkSomething(2) 
     & checkSomething(3) 
} 
+2

Dies wird '1' oder' 0' zurückgeben, nicht 'true' oder' false' , aber es scheint wie eine produktive Richtung. – jfriend00

+8

'return !! (checkSomething (1) & checkSomething (2) & checkSomething (3)' um boolean zu bekommen –

+0

besser 'return !! (checkSomething (1) | checkSomething (2) | checkSomething (3))' – Thomas

Verwandte Themen