Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 101
4.10.2Logisches ODER (||)
ОглавлениеDer ||-Operator verknüpft die beiden Operanden mit einem logischen ODER. Sind beide Operanden truthy-Werte, liefert der Operator einen truthy-Wert. Sind beide Operanden falsy-Werte, liefert der Operator einen falsy-Wert.
Obwohl der ||-Operator in der Regel meist einfach als boolescher ODER-Operator zum Einsatz kommt, weist er wie der &&-Operator ein komplexeres Verhalten auf. Der Operator beginnt bei der Auswertung mit dem ersten Operanden, dem Ausdruck auf der linken Seite. Wenn der Wert dieses ersten Operanden truthy ist, agiert der Operator »kurzschließend« und gibt den Ausdruck auf der linken Seite zurück, ohne den Ausdruck auf der rechten Seite überhaupt auszuwerten. Wenn der Wert des ersten Operanden dagegen falsy ist, wertet || den zweiten Operanden aus und gibt den Wert dieses Ausdrucks zurück.
Wie beim &&-Operator sollten Sie auf der rechten Seite Operanden vermeiden, die Nebeneffekte haben können, es sei denn, Sie möchten explizit den Umstand ausnutzen, dass der Ausdruck auf der rechten Seite eventuell nicht ausgewertet wird.
Eine sprachtypische Verwendungsweise dieses Operators ist sein Einsatz zur Auswahl des ersten wahren Werts in einer Menge von Alternativen:
// Wenn maxWidth truthy ist, nimm diesen Wert. Untersuche andernfalls
// das Objekt preferences. // Ist es nicht truthy, nimm die angegebene Konstante.
let max = maxWidth || preferences.maxWidth || 500;
Beachten Sie aber bitte, dass diese Konstruktion nur korrekt funktioniert, wenn maxWidth niemals 0 wird, da 0 ein falsy-Wert ist. Der ??-Operator (siehe 4.13.2) bietet eine Alternative.
Vor ES6 wurde dieses Idiom häufig in Funktionen verwendet, um Standardwerte für Parameter anzugeben:
// Die Eigenschaften von o auf p kopieren und p zurückgeben.
function copy(o, p) {
p = p || {}; // Wurde für p kein Objekt übergeben, nutze ein neu erstelltes.
// Hier folgt der Funktionskörper.
}
In ES6 und später wird dieser Trick jedoch nicht mehr benötigt, da der Standardwert für einen Parameter einfach in die Funktionsdefinition selbst aufgenommen werden kann: function copy(o, p={}) { … }.