403 Stimmen

JavaScript OR (||) Erklärung der Variablenzuweisung

Mit diesem JavaScript-Schnipsel...

var a;
var b = null;
var c = undefined;
var d = 4;
var e = 'five';

var f = a || b || c || d || e;

alert(f); // 4

Kann mir bitte jemand erklären, wie diese Technik genannt wird (meine beste Vermutung steht im Titel dieser Frage!)? Und wie/warum sie genau funktioniert?

Nach meinem Verständnis ist die Variable f wird der nächstgelegene Wert (von links nach rechts) der ersten Variablen zugewiesen, die einen Wert hat, der nicht entweder null oder undefiniert ist, aber ich habe es nicht geschafft, viel Referenzmaterial über diese Technik zu finden, und ich habe gesehen, dass sie oft verwendet wird.

Ist diese Technik auch spezifisch für JavaScript? Ich weiß, dass etwas Ähnliches in PHP zu folgenden Ergebnissen führen würde f einen wahren booleschen Wert hat, anstatt den Wert von d selbst.

249voto

unwind Punkte 377331

Voir Kurzschlussauswertung für die Erklärung. Es ist eine übliche Art der Implementierung dieser Operatoren; es ist nicht einzigartig für JavaScript.

239voto

Christian C. Salvadó Punkte 763569

Dies dient der Zuordnung einer Standardwert , in diesem Fall der Wert von y wenn die x Variable ist falsy .

Die booleschen Operatoren in JavaScript können einen Operanden zurückgeben, und nicht immer ein boolesches Ergebnis wie in anderen Sprachen.

Der logische OR-Operator ( || ) gibt den Wert seines zweiten Operanden zurück, wenn der erste falsch ist, andernfalls wird der Wert des ersten Operanden zurückgegeben.

Zum Beispiel:

"foo" || "bar"; // returns "foo"
false || "bar"; // returns "bar"

Falsy Werte sind diejenigen, die dazu zwingen false wenn sie im booleschen Kontext verwendet werden, und sie sind 0 , null , undefined eine leere Zeichenkette, NaN und natürlich false .

234voto

Anurag Punkte 136648

Javacript verwendet Kurzschlussauswertung für logische Operatoren || et && . Sie unterscheidet sich jedoch von anderen Sprachen dadurch, dass sie das Ergebnis des letzten Wertes, der die Ausführung angehalten hat, zurückgibt, anstatt eine true , oder false Wert.

Die folgenden Werte werden in JavaScript als fehlerhaft angesehen.

  • falsch
  • null
  • "" (leere Zeichenkette)
  • 0
  • Nan
  • undefiniert

Das Ignorieren der Vorrang des Operators Regeln, und um die Dinge einfach zu halten, zeigen die folgenden Beispiele, welcher Wert die Auswertung angehalten hat und als Ergebnis zurückgegeben wird.

false || null || "" || 0 || NaN || "Hello" || undefined // "Hello"

Die ersten 5 Werte bis zu NaN sind falsy, d.h. sie werden alle von links nach rechts ausgewertet, bis sie auf den ersten wahren Wert treffen - "Hello" was den gesamten Ausdruck wahr macht, so dass alles, was weiter oben steht, nicht ausgewertet wird, und "Hello" wird als Ergebnis des Ausdrucks zurückgegeben. Ähnlich ist es in diesem Fall:

1 && [] && {} && true && "World" && null && 2010 // null

Die ersten 5 Werte sind alle wahrheitsgemäß und werden ausgewertet, bis sie auf den ersten falschen Wert treffen ( null ), wodurch der Ausdruck falsch wird, also 2010 wird nicht mehr ausgewertet, und null wird als Ergebnis des Ausdrucks zurückgegeben.

In dem von Ihnen angeführten Beispiel wird diese Eigenschaft von JavaScript genutzt, um eine Zuweisung durchzuführen. Sie kann überall dort eingesetzt werden, wo Sie den ersten wahren oder falschen Wert aus einer Reihe von Werten benötigen. Der folgende Code weist den Wert "Hello" a b da es so einfacher ist, einen Standardwert zuzuweisen, anstatt if-else-Prüfungen durchzuführen.

var a = false;
var b = a || "Hello";

Man könnte das folgende Beispiel als Ausnutzung dieser Funktion bezeichnen, und ich glaube, dass der Code dadurch schwieriger zu lesen ist.

var messages = 0;
var newMessagesText = "You have " + messages + " messages.";
var noNewMessagesText = "Sorry, you have no new messages.";
alert((messages && newMessagesText) || noNewMessagesText);

Innerhalb des Alarms prüfen wir, ob messages falsy ist, und wenn ja, dann auswerten und zurückgeben noNewMessagesText , sonst auswerten und zurückgeben newMessagesText . Da es in diesem Beispiel falsch ist, halten wir bei noNewMessagesText an und melden "Sorry, you have no new messages." .

54voto

Alsciende Punkte 25697

Javascript-Variablen sind nicht typisiert, so dass f ein ganzzahliger Wert zugewiesen werden kann, auch wenn er durch boolesche Operatoren zugewiesen wurde.

f wird der nächstliegende Wert zugewiesen, der nicht gleichbedeutend mit falsch . So werden 0, false, null, undefiniert, alle übergeben:

alert(null || undefined || false || '' || 0 || 4 || 'bar'); // alerts '4'

32voto

Marcin Punkte 7674

Das hat nichts mit Magie zu tun. Boolesche Ausdrücke wie a || b || c || d faul ausgewertet werden. Interpeter sucht nach dem Wert von a undefiniert, also falsch, und macht weiter, dann sieht es b was null ist, was immer noch ein falsches Ergebnis liefert, also macht es weiter, dann sieht es c - dieselbe Geschichte. Schließlich sieht sie d und sagt: "Aha, es ist nicht null, ich habe also mein Ergebnis", und weist es der endgültigen Variablen zu.

Dieser Trick funktioniert in allen dynamischen Sprachen, die eine faule Kurzschlussauswertung von booleschen Ausdrücken durchführen. In statischen Sprachen wird er nicht kompiliert (Typfehler). In Sprachen, die boolesche Ausdrücke eifrig auswerten, wird er einen logischen Wert zurückgeben (d.h. in diesem Fall true).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X