Ich würde gerne wissen, ob JavaScript eine "Kurzschluss" -Bewertung wie && Operator in C # hat. Wenn nicht, würde ich gerne wissen, ob es eine Problemumgehung gibt, deren Übernahme sinnvoll ist.
javascript
short-circuiting
GibboK
quelle
quelle
https://www.google.com/search?q=site:stackoverflow.com+%s
als Suchverknüpfung (Chrome / Firefox) hinzugefügt, um die Suche zu beschleunigen.Antworten:
Ja, JavaScript hat eine "Kurzschluss" -Auswertung.
Live DEMO
Live DEMO
quelle
Short-circuit
mit diesem Logikoperator geben. Probieren Sie es einfach selbst aus. Nutze meine Demo.Diese Antwort geht sehr detailliert darauf ein, wie Kurzschlussfunktioniert in JavaScript mit allen Gotchas und auch relevanten Themen wie der Priorität von Operatoren. Wenn Sie nach einer schnellen Definition suchen und bereits verstehen, wie Kurzschlüsse funktionieren, würde ich empfehlen, andere Antworten zu überprüfen.
Was wir (dachten wir) bisher wussten:
Lassen Sie uns zunächst das Verhalten untersuchen, mit dem wir alle vertraut sind, und zwar innerhalb des
if()
Blocks, in dem wir&&
überprüfen, ob die beiden Dinge sindtrue
:Ihr erster Instinkt ist wahrscheinlich zu sagen: "Ah ja, ganz einfach, der Code führt die Anweisung aus, wenn beide
expr1
undexpr2
als ausgewertet werden.true
"Ja und nein. Sie sind technisch korrekt, das ist das Verhalten, das Sie beschrieben haben, aber genau so wird der Code nicht bewertet, und wir müssen tiefer gehen, um ihn vollständig zu verstehen.
Wie genau ist das
&&
und||
interpretiert?:Es ist Zeit, "unter die Haube der Javascript Motor ". Betrachten wir dieses praktische Beispiel:
Nun, das Ergebnis ist
260
... aber warum? Um die Antwort zu erhalten, müssen wir verstehen, wie die Kurzschlussbewertung funktioniert.Das bedeutet, dass in unserem praktischen Beispiel
const res
das folgendermaßen bewertet wird:expr1
-sanitise(0xFF)
0xFF
ist eine gültige Hexadezimalzahl für 250, sonst würde ich zurückkehrenNaN
expr1
gab einen "wahrheitsgemäßen" Wert zurück, Zeit zum Ausführenexpr2
(sonst würde ich aufhören, daNaN
es falsch ist)userinput
truthy (eine Zahl) ist, kann ich hinzufügen ,+5
um esSo konnten wir mit einer einfachen Bedienung des Operators zusätzliche
if
Blöcke und weitereisNaN
Überprüfungen vermeiden&&
.Wie es wirklich funktioniert:
Inzwischen sollten wir zumindest ein Bild davon haben, wie die KurzschlussBediener arbeiten. Die universelle Regel lautet:
(some falsy expression) && expr
wird zu falschem Ausdruck ausgewertet(some truthy expression) || expr
wird zum wahrheitsgemäßen Ausdruck auswertenHier einige weitere Beispiele zum besseren Verständnis:
Eine letzte lästige, aber sehr wichtige Sache [Operator Precedence]:
Schön, hoffentlich kriegst du den Dreh raus! Das Letzte, was wir wissen müssen, ist eine Regel über die Priorität von Operatoren, das heißt:
&&
Operator wird immer vor dem||
Operator ausgeführt.Betrachten Sie das folgende Beispiel:
Dies wird als, vielleicht verwirrend für einige als zurückkehren
a()
. Die Vernunft ist ganz einfach, es ist nur unser Sehvermögen, das uns täuscht, weil wir es gewohnt sind, von links nach rechts zu lesen. Nehmen wir dasconsole.log()
und was nicht raus und konzentrieren uns nur auf die BewertungNun, um Ihren Kopf darum zu wickeln:
Wir sagten, der
&&
Operator hat Vorrang, daher wird er als erster bewertet. Denken Sie an die Definition, damit wir uns die Bewertung besser vorstellen könnenWo:
expr2
istfalse
expr1
isttrue || false
Das war also der schwierige Teil, jetzt
true || false
wird ausgewertet (dieexpr1
- linke Seite von&&
).||
Operator die Ausführung stoppt, wennexpr1 || expr2
inexpr1
als wahr bewertet wird,expr1
wird die Ausführung ausgeführt und die Codeausführung wird gestoppt .Der zurückgegebene Wert ist
true
Nun ... das war ziemlich knifflig, alles wegen der wenigen seltsamen Regeln und Semantik. Aber denken Sie daran, Sie können sich immer der Vorrangstellung des Operators entziehen
()
- genau wie in der Mathematikquelle
expr1
undexpr2
odercondition1
oder was auch immer reden , das ist nur verwirrend. Entscheiden Sie sich für eine, Sie können auch lokale Variablen einführen, z.const expr1 = true; if(expr1 && ...)