Wenn Sie in Javascript eine if-Anweisung mit mehreren zu testenden Bedingungen verwenden, werden diese von Javascript unabhängig davon getestet, oder wird sie vor dem Testen aller ausgeführt, wenn sie bereits falsch sind?
Beispielsweise:
a = 1
b = 2
c = 1
if (a==1 && b==1 && c==1)
Wird Javascript alle drei dieser Bedingungen testen oder, nachdem festgestellt wurde, dass b nicht gleich 1 ist und daher falsch ist, die Anweisung verlassen?
Ich frage aus Sicht der Leistung. Wenn ich zum Beispiel 3 komplexe jQuery-Selektoren teste, möchte ich, dass jQuery das DOM nicht dreimal durchläuft, wenn über das erste offensichtlich ist, dass es FALSE zurückgibt. (In diesem Fall wäre es sinnvoller, 3 if-Anweisungen zu verschachteln).
ADDENDUM: Eher eine Neugier, was ist der richtige Begriff dafür? Ich stelle fest, dass viele von Ihnen den Begriff "Kurzschluss" verwenden. Tun dies auch einige Sprachen und andere nicht?
quelle
Antworten:
Der
&&
Bediener "schließt kurz" - das heißt, wenn die linke Bedingung falsch ist, macht er sich nicht die Mühe, die rechte zu bewerten.Ebenso schließt der
||
Bediener kurz, wenn die linke Bedingung erfüllt ist.BEARBEITEN: Sie sollten sich jedoch keine Sorgen um die Leistung machen, bis Sie ein Benchmarking durchgeführt und festgestellt haben, dass es sich um ein Problem handelt. Vorzeitige Mikrooptimierung ist der Fluch der Wartbarkeit.
quelle
if (!barSticky && bar.parent().offset().top <= document.documentElement.scrollTop)
Die zweite Bedingung ist eine teurere Berechnung, die erste ist nur ein Boolescher Wert. :)Unter Leistungsgesichtspunkten ist dies keine Mikrooptimierung.
Wenn wir 3 Boolesche Variablen haben, a, b, c, ist das eine Mikrooptimierung.
Wenn wir 3 Funktionen aufrufen, die boolesche Variablen zurückgeben, kann jede Funktion lange dauern, und es ist nicht nur wichtig, diese Kurzschlüsse zu kennen, sondern auch in welcher Reihenfolge. Beispielsweise:
ist viel besser als
wenn beide gleich wahrscheinlich false zurückgeben.
quelle
Deshalb können Sie in Javascript Code wie tun
Was bedeuten würde, dass wenn x undefiniert oder anderweitig 'falsch' ist, der Standardwert 2 ist.
quelle
Falls sich jemand fragt, ob es eine Möglichkeit gibt, die Auswertung aller Zustände zu erzwingen , können in einigen Fällen die bitweisen Operatoren
&
und|
verwendet werdenDiese sollten sehr vorsichtig verwendet werden, da bitweise Operatoren arithmetische Operatoren sind, die mit einzelnen Bits ihres Operanden arbeiten und nicht immer als "Nicht-Kurzschluss" -Version von
&&
und fungieren können||
Beispiel:
aber
Hoffe, es hilft jemandem, der hier angekommen ist und nach solchen Informationen sucht (wie ich) und danke an @Max für die Korrektur und das Gegenbeispiel
quelle
false && (alert(""))
Lösung nicht zumvar a=false; var b=check(); alert(a && b);
Es werden nur alle Bedingungen getestet, wenn die ersten zutreffen. Testen Sie es selbst:
quelle
Es schließt kurz - nur a und b werden in Ihrem Beispiel verglichen.
quelle
Ein weiterer Grund, warum die Auswertung mit einem oder mehreren Parametern links gestoppt wird.
if (response.authResponse && (response.authResponse.accessToken! = user.accessToken)) {...}
Die zweite Auswertung setzt voraus, dass die erste wahr ist, und gibt keinen Kompilierungsfehler aus, wenn response.authResponse null oder undefiniert usw. ist, da die erste Bedingung fehlgeschlagen ist.
Andere Sprachen hatten dieses Problem in den frühen Tagen und ich denke, es ist jetzt ein Standardansatz beim Erstellen von Compilern.
quelle
Es wird beendet, nachdem festgestellt wurde, dass b nicht gleich eins ist.
quelle
Für alle, die mit dieser Frage verwirrt sind, weil sie das Kurzschlussverhalten bei Verwendung eines
||
in Verbindung mit einem?
Operator wie diesem nicht sehen:x = 1 || true ? 2 : 3 // value of x will be 2, rather than 1 as expected
Es scheint, dass die Kurzschlussregel nicht funktioniert. Warum bewertet es den zweiten Term des
||
(wahr? 2: 3), wenn der erste wahr ist? Es stellt sich heraus, dass es sich um ein Problem mit der Reihenfolge der Operationen handelt, da das oben Genannte dem entsprichtx = (1 || true) ? 2 : 3
mit dem
||
zuerst ausgewerteten und dem?
ausgewerteten zweiten. Was Sie wahrscheinlich wollen, ist:x = 1 || (true ? 2 : 3)
quelle