Gleichheitsoperatoren in Javascript: Gleich ist nicht gleich gleich

Javascript. Gleich ist nicht immer gleich Gleich!

Hallo Blog, da bin ich wieder. In meinem ersten richtigen Artikel möchte ich etwas über die Gleichheits-Operatoren in Javascript schreiben.

In Javascript gibt es vier Gleichheitsoperatoren:

  • Gleich: ==
  • Ungleich: !=
  • striktes gleich: ===
  • striktes ungleich: !==
Die Standard-Gleichheitsoperatoren

In seinem Buch „Javascript: The good parts“ schreibt Douglas Crockford:

My advice is to never use the evil twins. Instead, always use ===and !==.

Die Ergebnisse der Gleichungsoperatoren kann man unter „The Abstract Equality Comparison Algorithm“ nachlesen. Bei manchen Beispielen führt dies zu allgemeinen Verwirrungen, wir schauen uns dabei folgende oft genannte Beispiele an:

'' == '0'           // false
0 == ''             // true
0 == '0'            // true

Glücklicherweise können wir uns einen Algorithms anschauen, um die Operatoren besser zu verstehen. Das erste Beispiel oben ergibt false wegen der folgenden Regel:

If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.

Im wesentlichen ist nämlich der komplette String-Inhalt nicht identisch. Deswegen auch false.

Im zweiten Beispiel sind die Objekttypen anders. Deswegen benutzen wir die folgende Regel:

If Type(x) is Number and Type(y) is String, return the result of the comparison x == ToNumber(y).

Ab hier wird’s etwas komplizierter zu verstehen: im Hintergrund ändern sich die values und Objekte in verschiedene Types. Der Gleichheits-Operator prüft in diesem Fall die sogenannten „primitive values“ – so wird false zurückgegeben wenn die beiden values nicht vom gleichen Type sind.
Das Ganze kann man sich auch gerne im Abschnitt „The Strict Equality Comparison Algorithm“ in der oben verlinkten Dokumentation zu Gemüte führen.

Die strikten Standard-Gleichheitsoperatoren

Testen wir das obere Beispiel nun mit den strikten Gleichheitsoperatoren, so ergeben sich folgende Ergebnisse:

'' === '0'           // false
0 === ''             // false
0 === '0'            // false

Schreiben so wirklich professionelle Javascript-Entwickler ihren Code? Und werden die strikten Gleichheitsoperatoren wirklich so oft benutzt? Wir schauen uns als Beispiel mal die Ajax-Methoden im jQuery Framework an:

executeOnly = ( structure === prefilters );
if ( typeof selection === "string" ) {
} else if ( params && typeof params === "object" ) {

Das strikte Gleich wird überall benutzt um sauberen Code zu erstellen. Bis auf an einer Stelle:

if ( s.crossDomain == null ) {

In diesem Beispiel soll beides (undefined und null) auf null geprüft werden. Würden die Entwickler an dieser Stelle mit dem strikten Operator arbeiten, so müsste folgendes geschrieben werden:

if ( s.crossDomain === null || s.crossDomain === undefined ) {

So wird das „einfache Gleich“ sehr oft für Objekten (z.B. am Anfang von jQuery-Plugins) benutzt, um auf ein Einstellungs-Objekt, welches direkt im Konstruktor übergeben wird, zu prüfen.

Fazit

Um zu verstehen wir genau „einfache“ und strikte Gleichheit und Gleichheitsoperatoren funktionieren, sollte man zunächst die primitive values und das Typenhandling (auch in Richtung Konvertierung – speziell für Javascript) verstehen.

Im Allgemeinen kann man noch abschließend sagen das erfahrene Javascript Entwickler, wie an dem jQuery-Beispiel zu sehen ist, meistens mit dem strikten === arbeiten. Anfänger sollten sich möglichst direkt damit anfreunden um so wenig Fehler zu machen.

Mehr zu dem Thema gibt es beispielsweise im Mozilla Developer Network im Beitrag Comparison Operators.

 

Flattr this!

4 Kommentare

  1. Weshalb unterscheidet Javascript eigentlich zwei verschiedene Vergleichsoperatoren? Andere Sprachen kommen ja schließlich auch mit nur einem Vergleichsoperator aus (wenn man jetzt mal den ungleich-Operator ausschließt).

    Generell erscheint mir das Debugging bei Javascript sehr schwierig zu sein. Während zum Beispiel bei Java oder C++ dir der Compiler beim compilieren einen Fehler ausspuckt, muss man bei Javascript immer erst das Script ausführen und dann mühselig nachstöbern, wo denn jetzt genau der Fehler ist. Irre ich mich, oder gibt es da einfachere Methoden, schnell und effizient in Javascript auf Fehlersuche zu gehen?

    Antworten

  2. […] Gleichheitsoperatoren in Javascript: Gleich ist nicht gleich gleich | Franky My advice is to never use the evil twins. Instead, always use ===and !==. Ich hoffe, […]

    Antworten

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.