Tut JavaScript haben "Short-circuit" Auswertung?
Ich würde gerne wissen, ob JavaScript "short-circuit" Auswertung wie && - Operator in C#. Wenn nicht, würde ich gerne wissen, ob es eine Problemumgehung, die Sinn macht zu übernehmen.
- Du bist herzlich willkommen. Ich habe
https://www.google.com/search?q=site:stackoverflow.com+%s
als such-Verknüpfung (Chrome/Firefox) zu beschleunigen sucht. - Auch hier eine Antwort auf meine Frage developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
- Weitere nützliche Ressourcen: Die || Auswertung Frage Die && Bewertung-Frage
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, JavaScript ist "short-circuit" Auswertung.
Live DEMO
Live DEMO
Short-circuit
mit dieser Logik operator. Probieren Sie es einfach selbst. Nutzen Sie meine demo.Diese Antwort geht in großen detail, wie Kurzschluss funktioniert in JavaScript, mit all den überraschungen und auch relevante Themen wie die Rangfolge der, wenn Sie suchen eine schnelle definition und bereits wissen, wie Kurzschluss arbeitet, würde ich empfehlen die überprüfung anderer Antworten.
, Was wir (denken wir) wussten bisher:
Lassen Sie uns zunächst untersuchen Sie das Verhalten, die wir alle kennen, innerhalb der
if()
block, wo wir&&
zu prüfen, ob die beiden Dinge sindtrue
:Nun, Ihr erste Instinkt ist wahrscheinlich zu sagen: " Ah ja, ganz einfach, der code, der die Anweisung ausführt, wenn beide
expr1
undexpr2
bewertet werden alstrue
'Nun, ja und Nein. Sie sind technisch korrekt, das ist das Verhalten, das Sie beschrieben, aber das ist nicht genau, wie der code ausgewertet wird und wir müssen tiefer Graben, um Sie vollständig zu verstehen.
Wie genau ist die
&&
und||
interpretiert?:Ist es Zeit, einen Blick "unter die Haube des javascript engine". Betrachten wir dieses Beispiel aus der Praxis:
JS:
Gut das Ergebnis ist
260
.. aber warum? Um das zu beantworten, müssen wir verstehen, wie funktioniert der short-circuit-evaluation der Arbeit.So bedeutet dies in unserem Beispiel aus der Praxis, die
const res
ausgewertet die folgende Weise:expr1
-sanitise(0xFF)
0xFF
ist eine gültige hexadezimale Zahl für 250, sonst würd ich zurückNaN
expr1
zurückgegeben "truthy" - Wert, Zeit zum ausführenexpr2
(sonst würd ich halt, wieNaN
ist falsy)userinput
ist truthy (eine Reihe), kann ich hinzufügen+5
esSo, hier waren wir in der Lage, um zu vermeiden, zusätzliche
if
Blöcke und weitereisNaN
prüft mit einer einfachen Benutzung der&&
Betreiber., Wie es wirklich funktioniert:
Jetzt, sollten wir zumindest ein Bild, wie das Kurzschluss, Betreiber arbeiten. Die Universelle Regel gilt:
(some falsy expression) && expr
bewerten zu falsy Ausdruck(some truthy expression) || expr
bewerten zu truthy AusdruckHier sind einige weitere Beispiele zum besseren Verständnis:
JS:
JS:
Eine Letzte lästige, aber sehr wichtige Sache, [Rangfolge]:
Schön, hoffentlich bist du immer den Dreh! Das Letzte was wir wissen müssen, ist in der Regel über die Rangfolge, das heißt:
&&
Betreiber wird immer ausgeführt, bevor die||
Betreiber.Betrachten Sie das folgende Beispiel:
JS:
Diese zurückkehren, vielleicht verwirrend, einige wie
a()
. Grund ist ganz einfach, es ist nur unsere Sehkraft, das irgendwie täuschen uns, weil wir gewohnt sind, zu Lesen von Links nach rechts. Nehmen wir dasconsole.log()
und was nicht und konzentrieren sich rein auf die BewertungNun um Ihren Kopf herum wickeln dies:
Gesagt die
&&
- operator hat Vorrang, so wird es beurteilt als erste. Helfen Sie uns besser vorstellen, der Bewertung, denken Sie an die definitionWo:
expr2
istfalse
expr1
isttrue || false
So, das war der schwierige Teil, jetzt
true || false
ist, bewertet (dieexpr1
- Links-Seite des&&
).||
Bediener Stoppt die Ausführung, wennexpr1 || expr2
imexpr1
bewertet als truthy, dieexpr1
ausgeführt wird, und die code-Ausführung Stoppt.Ist der zurückgegebene Wert
true
Gut.. das war ganz schön tricky, das alles wegen der paar seltsame Regeln und Semantik. Aber denken Sie daran, Sie können immer entkommen Rangfolge mit der
()
- genau wie in der MathematikJS:
expr1
undexpr2
odercondition1
oder was auch immer, das ist nur verwirrend. Für eins entscheiden, könnte man auch einführen, lokale Variablen, zB.const expr1 = true; if(expr1 && ...)