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.
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.
Antworten:
Ja, JavaScript hat eine "Kurzschluss" -Auswertung.
if (true == true || foo.foo){
// Passes, no errors because foo isn't defined.
}
if (false && foo.foo){
// Passes, no errors because foo isn't defined.
}
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.
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 sind true
:
if (true && true) {
console.log('bar');
}
Ihr erster Instinkt ist wahrscheinlich zu sagen: "Ah ja, ganz einfach, der Code führt die Anweisung aus, wenn beide expr1
und expr2
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.
&&
und ||
interpretiert?:Es ist Zeit, "unter die Haube der Javascript Motor ". Betrachten wir dieses praktische Beispiel:
function sanitise(x) {
if (isNaN(x)) {
return NaN;
}
return x;
}
let userinput = 0xFF; // as an example
const res = sanitise(userinput) && userinput + 5
console.log(res);
Nun, das Ergebnis ist 260
... aber warum? Um die Antwort zu erhalten, müssen wir verstehen, wie die Kurzschlussbewertung funktioniert.
Durch die MDN-Definition wird der
&&
Operator in wieexpr1 && expr2
folgt ausgeführt:Wenn
expr1
konvertiert werden kann,true
wird zurückgegebenexpr2
; sonst kehrt zurückexpr1
.
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ückkehren NaN
expr1
gab einen "wahrheitsgemäßen" Wert zurück, Zeit zum Ausführen expr2
(sonst würde ich aufhören, da NaN
es falsch ist)userinput
truthy (eine Zahl) ist, kann ich hinzufügen , +5
um es
- "Wahrheit" bedeutet, dass der Ausdruck als wahr bewertet werden kann. Hier ist eine Liste von wahrheitsgemäßen und falschen Ausdrücken.
So konnten wir mit einer einfachen Bedienung des Operators zusätzliche if
Blöcke und weitere isNaN
Überprüfungen vermeiden &&
.
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:
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() && b() ){
console.log('foobar');
}
//Evaluates a() as false, stops execution.
function a() { console.log('a'); return false; }
function b() { console.log('b'); return true; }
if ( a() || b() ){
console.log('foobar');
}
/* 1. Evaluates a() as false
2. So it should execute expr2, which is `b()`
3. b() returned as true, executing statement `console.log('foobar');`
*/
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:
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log(a() || b() && c());
// returns a() and stops execution
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 das console.log()
und was nicht raus und konzentrieren uns nur auf die Bewertung
true || false && false
Nun, 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önnen
expr1 && expr2
Wo:
expr2
ist false
expr1
ist true || false
Das war also der schwierige Teil, jetzt true || false
wird ausgewertet (die expr1
- linke Seite von &&
).
||
Operator die Ausführung stoppt, wenn expr1 || expr2
in expr1
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 Mathematik
function a() { console.log('a'); return true;}
function b() { console.log('b'); return false;}
function c() { console.log('c'); return false;}
console.log((a() || b()) && c());
/* 1. The () escape && operator precedence
2. a() is evaluated as false, so expr2 (c()) to be executed
3. c()
*/
expr1
und expr2
oder condition1
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 && ...)
https://www.google.com/search?q=site:stackoverflow.com+%s
als Suchverknüpfung (Chrome / Firefox) hinzugefügt, um die Suche zu beschleunigen.