Frage Wird eine JavaScript-Anweisung mit mehreren Bedingungen alle getestet?


Wenn in JavaScript eine if-Anweisung mit mehreren Bedingungen zum Testen verwendet wird, testet JavaScript sie alle unabhängig davon, oder wird sie vor dem Testen aller, falls sie bereits falsch ist, bailet?

Beispielsweise:

 a = 1
 b = 2
 c = 1

 if (a==1 && b==1 && c==1)

Wird Javascript für alle 3 dieser Bedingungen testen, oder nachdem es gesehen hat, dass b nicht gleich 1 ist und daher falsch ist, wird es die Aussage verlassen?

Ich frage vom Standpunkt der Leistung. Wenn ich zum Beispiel 3 komplexe jQuery-Selektoren teste, würde ich lieber nicht jQuery das DOM 3 mal durchlaufen lassen, wenn es offensichtlich ist, dass es über die erste zurückgibt, dass es FALSE zurückgibt. (In diesem Fall wäre es sinnvoller, 3 if-Anweisungen zu verschachteln).

NACHTRAG: Mehr Neugierde, was ist der richtige Ausdruck dafür? Ich stelle fest, dass viele von Ihnen den Begriff "Kurzschluss" verwenden. Auch tun einige Sprachen dies und andere nicht?


75
2017-12-18 20:26


Ursprung


Antworten:


Das && Operator "kurzgeschlossen" - das heißt, wenn die linke Bedingung falsch ist, ist es nicht störend, die richtige zu bewerten.

Ähnlich, die || der Bediener schließt, wenn die linke Bedingung wahr ist.

EDIT: Allerdings sollten Sie sich keine Gedanken über die Leistung machen, bis Sie ein Benchmarking durchgeführt und festgestellt haben, dass es ein Problem ist. Vorzeitige Mikro-Optimierung ist der Fluch der Wartbarkeit.


110
2017-12-18 20:28



Aus Performance-Sicht ist dies keine Mikrooptimierung.

Wenn wir 3 boolesche Variablen haben, a, b, c ist das eine Mikrooptimierung.

Wenn wir 3 Funktionen aufrufen, die boolsche Variablen zurückgeben, kann jede Funktion sehr lange dauern, und es ist nicht nur wichtig, diese Kurzschlüsse zu kennen, sondern auch in welcher Reihenfolge. Beispielsweise:

if (takesSeconds () && takesMinutes ())

ist viel besser als

if (takesMinutes () && takesSeconds ())

wenn beide gleichermaßen falsch zurückgeben.


11
2017-12-18 21:21



Deshalb können Sie in JavaScript-Code wie tun

var x = x || 2;

Was bedeutet, dass, wenn x undefiniert oder sonst "falsch" ist, der Standardwert 2 ist.


9
2017-12-18 20:32



Falls sich jemand fragt, ob es einen Weg gibt forciere die Bewertung von allem Zustand, in manchen Fällen die bitweisen Operatoren & und | kann verwendet werden

var testOr = true | alert(""); //alert pops up
var testAnd = false & alert(""); //alert pops up

Diese sollten verwendet werden wirklich sorgfältig Weil bitweise Operatoren arithmetische Operatoren sind, die an einzelnen Bits ihres Operanden arbeiten und nicht immer als "Nicht-Kurzschluss" -Version funktionieren können && und || 

Beispiel:

-2147483648 && 1 = 1 

aber

-2147483648 & 1 = 0

Hoffentlich hilft es jemandem, der hier angekommen ist, nach Informationen wie diesem zu suchen (wie ich) und dank @Max für die Korrektur und das Gegenbeispiel


9
2017-09-21 10:33



Es prüft nur alle Bedingungen, wenn die ersten wahr sind, teste es selbst:

javascript: alert (false && alert("A") && false);

7
2017-12-18 20:29



Es kommt zu Kurzschlüssen - nur a und b werden in Ihrem Beispiel verglichen.


3
2017-12-18 20:29



Es endet, nachdem er gesehen hat, dass b nicht eins ist.


2
2017-12-18 20:28