Ein wirklich schönes Feature von Javascript ist das Verhalten von Und- (&&) und Oder-Operator (||). Anders als in den meisten mir bekannten Sprachen liefern diese nämlich keinen Boolean zurück. Dank automatischer Typkonvertierung ist dies auch nicht nötig.
Der Klassiker: || liefert Boolean
Der klassische Verwendungsfall der Vergleichsoperatoren ist die If-Bedingung:
if (false || 42) // ...
If entscheidet anhand eines boolschen Wertes, ob der nachstehende Code ausgeführt werden soll. Daher muss || in typisierten Sprachen wie Java eben einen solchen Typen zurückliefern.
Javascript ist darauf nicht angewiesen: if (true)
und if (42)
laufen auf das selbe hinaus. Grandios ist nun die Idee, dies für && und || auszunutzen.
Javascript: || und && können mehr
Rückgabe von zwei mit || verglichenen Elementen
- das einzige positive Element
- das letzte von zwei negativen Elementen
- das erste von zwei positiven Elementen
Die Regeln sind von oben nach unten abzuarbeiten. Ein paar Beispiele:
console.log(1 || 42); // 1
console.log(42 || 1); // 42
console.log(false || 42); // 42
console.log(false || null); // null
console.log("" || 42); // 42
Rückgabe von zwei mit && verglichenen Elementen
- das negative Element
- das erste von zwei negativen Elementen
- das letzte von zwei positiven Elementen
console.log(1 && 42); // 42
console.log(42 && 1); // 1
console.log(false && 1); // false
console.log(false && null); // false
Anwendung: Defaultwerte für Paramter
Die genannten Eigenschaften lassen sich super dafür nutzen, Parameter zu prüfen und direkt Default-Werte zu setzen, wenn diese nicht angegeben sind.
Ein Beispiel, dass dies verdeutlicht und zu gleich zeigt, wie man es nicht macht:
function add(x, y) {
x = x || 42;
y = y || 10;
return x + y;
}
Werden x
und y
zu false
konvertiert, so bekommen sie auf schnelle und einfache Weise einen Defaultwert.
Problemfälle
Für eine Additionsfunktion ist obige Wahl denkbar ungeeignet. Man darf nicht vergessen, dass für Javascript auch 0 == false
gilt. Man muss also vorsichtig sein, wenn der Parameter vom Typ Number, String oder Boolean ist:
0 == false
"" == false
false == false
Für diese Fälle sollte man z.B. auf Inline-Conditions zurückgreifen:
function add(x, y) {
x = (typeof x == 'number') ? x : 42;
y = (typeof y == 'number') ? y : 10;
return x + y;
}
In vielen Fällen kann man die obigen Eigenschaften aber sehr gut anwenden und schnell und einfach sicherstellen, dass ein Parameter „true“ ist. Auch die Eigenschaften von && lassen sich ähnlich nutzen, allerdings sind die entsprechenden Anwendungsfälle selten, nicht wirklich in meiner Denkweise verankert oder beides.
Du benutzt einfach DIE Zahl, ohne das Buch gelesen zu haben. *Kopf-schüttel*
Aber eine interessante Idee diese Sache so zu nutzen.
Na das ist doch die größte Adelung für das Buch, wenn es auch ohne diesen Kontext und sogar von Nichtlesern zitiert wird.
Ja, aber die Sache mit dem Oder ist echt cool. Habe mich schon manches mal geärgert, dass PHP das nicht kann. Sollte ja auch gehen.