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."
.