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-circuitmit 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 expr1und expr2als 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 && expr2folgt ausgeführt:Wenn
expr1konvertiert werden kann,truewird zurückgegebenexpr2; sonst kehrt zurückexpr1.
Das bedeutet, dass in unserem praktischen Beispiel const resdas folgendermaßen bewertet wird:
expr1-sanitise(0xFF)0xFF ist eine gültige Hexadezimalzahl für 250, sonst würde ich zurückkehren NaNexpr1gab einen "wahrheitsgemäßen" Wert zurück, Zeit zum Ausführen expr2 (sonst würde ich aufhören, da NaNes falsch ist)userinputtruthy (eine Zahl) ist, kann ich hinzufügen , +5um 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 ifBlö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 falseexpr1 ist true || falseDas war also der schwierige Teil, jetzt true || falsewird ausgewertet (die expr1- linke Seite von &&).
||Operator die Ausführung stoppt, wenn expr1 || expr2in expr1als wahr bewertet wird, expr1wird 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()
*/
expr1und expr2 oder condition1oder 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+%sals Suchverknüpfung (Chrome / Firefox) hinzugefügt, um die Suche zu beschleunigen.