Scriptease.js: Vergleiche mit typsicheren Operatoren

Seite 2: Das Beste rausholen

Inhaltsverzeichnis

Diesem Wirrwarr lässt sich auf zwei Arten begegnen: Entweder indem man ihm aus dem Weg geht oder indem man sich dieses spezielle Verhalten zu Nutze macht. Die erste Wahl lässt sich ausgesprochen leicht umsetzen: Beim Einsatz des ===- anstelle des ==-Operators wird zusätzlich zum eigentlichen Wert beziehungsweise der Referenz auch der jeweilige Typ berücksichtigt, und JavaScript verhält sich genauso wie die C-Sprachen:

console.log(0 === ''); // => false
console.log(0 === '0'); // => false
console.log(0 === false); // => false
console.log(null === undefined); // => false

Analog zum !=-Operator gibt es den !==-Operator, der auf Ungleichheit unter Berücksichtigung des Typs prüft:

console.log(0 != '0'); // => false
console.log(0 !== '0'); // => true

Als Faustregel lässt sich festhalten, dass man stets die typsicheren Operatoren === und !== verwenden sollte, um durch die implizite Konvertierung hervorgerufene und daher gut versteckte logische Fehler zu verhindern. Dennoch gibt es Szenarien, in denen die implizite Konvertierung gewünscht sein kann. Häufig ist beispielsweise bei Zeichenketten zu prüfen, ob sie einen Wert enthalten, bevor eine Verarbeitung angestoßen wird. Während in C# Konstrukte wie

if(foo != null && foo.Length > 0) { ... }

oder

if(String.IsNullOrWhitespace(foo)) { ... }

erforderlich sind, genügt es in JavaScript, die zu prüfende Zeichenkette als Bedingung anzugeben:

if(foo) { ... }

Auch die Existenz von Objekteigenschaften lässt sich auf dem Weg vornehmen. Da JavaScript beim Zugriff auf eine nicht vorhandene Eigenschaft den Wert undefined zurückliefert, lässt sich auf einfache Weise deren Existenz prüfen und entsprechend handeln:

if(customer.middleName) { ... }

Zu guter Letzt machen sich auch die beiden logischen Operatoren || und && das Verhalten des Typsystems zu Nutze. Anders als ihre Pendants in den C-Sprachen geben sie nämlich keinen Wahrheitswert zurück, sondern einen der beiden zu verknüpfenden Werte. Der ODER-Operator || liefert im Fall, dass sich der erste Operand zu true evaluieren lässt, diesen zurück, ansonsten den zweiten:

var a = 23,
b = 42,
result = a || b;

Die Variable result enthält in dem Fall den Wert 23. Beim Verwenden dieses Ausdruck in einer Bedingung ergibt sich genau der gewünschte Effekt: Die Bedingung wird zu true evaluiert, da 23 ungleich 0 gilt und nur die Zahl 0 zu false ausgewertet wird.

Als Nebeneffekt lässt sich der ||-Operator aber auch für einen anderen Einsatzzweck verwenden: den Fallback auf einen Standardwert. Beispielsweise könnte man beim Auslesen von Konfigurationsdaten zunächst den Wert des Benutzers nutzen. Falls dieser jedoch nicht gesetzt wird, verwendet man einen geeigneten Standardwert:

var userValue = getUserValue(),
value = userValue || 23;

Analog funktioniert auch der &&-Operator, mit der Ausnahme, dass sich dessen Logik umgekehrt verhält: Lässt sich der erste Operand zu true evaluieren, gibt er den zweiten Operanden zurück, ansonsten den ersten.

Das Typsystem von JavaScript wirkt auf den ersten Blick unscheinbar und harmlos, birgt jedoch etliche Besonderheiten. Für einen Entwickler, der eine andere Sprache gewöhnt ist, stellen diese durchaus eine große Gefahr dar, schließlich ist es ein Leichtes, versehentlich nur schwer auffindbare logische Fehler einzubauen. Wer sich jedoch auf JavaScript und dessen Besonderheiten einlässt, wird mit ausgesprochen mächtigen Sprachfunktionen belohnt, die in vielen Fällen einiges an Tipparbeit sparen können. Das führt zu kompakterem, besser lesbarem und letztlich zu verständlicherem Code.

Als Zusammenfassung kann gelten, dass Vergleiche prinzipiell ausschließlich mit typsicheren Operatoren === und !== ausgeführt werden sollten. Dennoch hat die implizite Konvertierung ihre Daseinsberechtigung und lässt sich insbesondere zur eleganten Prüfung der Existenz von Objekten und für den kompakten Fallback auf Standardwerte nutzen.

Golo Roden
ist freiberuflicher Wissensvermittler und Technologieberater für Webentwicklung, Codequalität und agile Methoden.
(ane)