JavaScript – Das Handbuch für die Praxis. David Flanagan
Definition von Gleichheit verwendet, bei der auch Typumwandlungen erlaubt sind.
Die Operatoren != und !== testen auf das genaue Gegenteil der ==- und ===-Operatoren. Der !=-Ungleichheitsoperator liefert false, wenn zwei Werte gemäß == gleich sind, ansonsten true. Der !==-Operator liefert false, wenn zwei Werte strikt betrachtet gleich sind, und true, wenn das nicht der Fall ist. Wie Sie in 4.10 sehen werden, berechnet der !-Operator die boolesche NICHT-Operation. Man kann sich also leicht merken, dass != und !== für »nicht gleich« und für »im strikten Sinne nicht gleich« stehen.
Die Operatoren =, == und ===
JavaScript unterstützt die Operatoren =, == und ===. Es ist wichtig, dass Ihnen die Unterschiede zwischen dem Zuweisungs-, dem Gleichheits- und dem Identitätsoperator (dem strikten Gleichheitsoperator) klar sind. Achten Sie beim Programmieren sorgfältig darauf, dass Sie tatsächlich den passenden Operator verwenden! Obgleich es verführerisch sein mag, bei allen drei Operatoren jeweils »gleich« zu lesen, können Sie möglichen Verwechslungen vorbeugen, wenn Sie für sich = mit »wird zugewiesen«, == mit »ist gleich« und === mit »ist identisch« übersetzen.
Der ==-Operator ist ein veraltetes Sprachmerkmal von JavaScript, dessen Gebrauch als überholt und gemeinhin als Fehlerquelle angesehen wird. Sie sollten in nahezu allen Fällen === anstelle von == und !== anstelle von != verwenden.
Wie in 3.8 bereits erwähnt, werden JavaScript-Objekte anhand der Referenz verglichen, nicht anhand des Werts. Dadurch ist ein Objekt nur mit sich selbst identisch – und mit keinem anderen Objekt. Zwei unabhängige Objekte, die die gleiche Anzahl an Eigenschaften mit gleichen Namen und gleichen Werten haben, sind dennoch nicht gleich. Auch sind zwei Arrays, die die gleichen Elemente in der gleichen Reihenfolge enthalten, nicht gleich.
Strikte Gleichheit
Der strikte Gleichheitsoperator === wertet seine Operanden aus und vergleicht die beiden Werte dann folgendermaßen, ohne eine Typumwandlung durchzuführen:
Die Werte sind nicht gleich, wenn sie unterschiedliche Typen haben.
Die Werte sind gleich, wenn beide null oder beide undefined sind.
Die Werte sind gleich, wenn beide den booleschen Wert true oder beide den booleschen Wert false haben.
Die Werte sind nicht gleich, wenn einer NaN ist oder beide es sind. (Es mag überraschend erscheinen, aber der NaN-Wert ist keinem anderen Wert gleich, nicht einmal sich selbst! Um zu prüfen, ob ein Wert x gleich NaN ist, können Sie den Ausdruck x !== x oder die globale Funktion isNaN() verwenden.)
Die Werte sind gleich, wenn beide Zahlen sind und den gleichen Wert haben. Sie sind ebenfalls gleich, wenn einer der Werte 0 und der andere -0 ist.
Die Werte sind gleich, wenn beide Strings sind und genau die gleichen 16-Bit-Werte (siehe den Kasten in 3.3) an genau den gleichen Positionen enthalten. Sie sind nicht gleich, wenn sie eine unterschiedliche Länge oder einen unterschiedlichen Inhalt haben. Zwei Strings können die gleiche Bedeutung und die gleiche Darstellung haben, aber dennoch mit unterschiedlichen Folgen von 16-Bit-Werten codiert sein. JavaScript führt keine Unicode-Normalisierung durch, und derartige Strings sind weder für den ===- noch für den ==-Operator gleich.
Die Werte sind gleich, wenn beide auf dasselbe Objekt, dasselbe Array oder dieselbe Funktion verweisen. Verweisen sie auf unterschiedliche Objekte, sind sie nicht gleich, selbst wenn beide Objekte gleiche Eigenschaften besitzen.
Gleichheit mit Typumwandlung
Der nicht-strikte Gleichheitsoperator == verhält sich ähnlich wie der strikte Gleichheitsoperator, ist dabei in seiner Auslegung von Gleichheit aber weniger streng. Haben die Werte der beiden Operanden nicht den gleichen Typ, versucht er, die Typen umzuwandeln, und vergleicht dann die umgewandelten Werte. Dabei gilt:
Haben zwei Werte den gleichen Typ, werden sie wie oben beschrieben auf strikte Gleichheit geprüft. Sind sie im strikten Sinne gleich, sind sie gleich. Sind sie nicht im strikten Sinne gleich, sind sie nicht gleich.
Haben die beiden Werte nicht den gleichen Typ, kann der ==-Operator sie dennoch als gleich betrachten. Er nutzt die folgenden Regeln und Typumwandlungen, um die Gleichheit zu prüfen:– Die Werte sind gleich, wenn einer der Werte null und der andere undefined ist.– Ist einer der Werte eine Zahl und der andere ein String, wird der String in eine Zahl umgewandelt, und der Vergleich wird dann mit dem umgewandelten Wert durchgeführt.– Ist einer der Werte true, wird er in 1 umgewandelt, und der Vergleich wird dann erneut ausgeführt. Ist einer der Werte false, wird er in 0 umgewandelt, und der Vergleich wird dann erneut durchgeführt.– Ist einer der Werte ein Objekt und der andere eine Zahl oder ein String, wird das Objekt anhand des in 3.9.3 beschriebenen Algorithmus in einen primitiven Wert umgewandelt, und der Vergleich wird dann erneut vorgenommen. Bei einer solchen Umwandlung in einen Primitivwert wird entweder die toString()- oder die valueOf()-Methode des Objekts benutzt. Die im Sprachkern von JavaScript integrierten Klassen versuchen zuerst, eine valueOf()-Umwandlung vorzunehmen, bevor eine toString()-Umwandlung ausprobiert wird. Nur die Klasse Date führt direkt eine toString()-Umwandlung durch.– Alle anderen Kombinationen von Werten sind nicht gleich.
Schauen Sie sich als Beispiel für die Prüfung auf Gleichheit den folgenden Vergleich an:
"1" == true // => true
Dieser Ausdruck wird zu true ausgewertet – diese beiden so unterschiedlich aussehenden Werte sind also in der Tat gleich: Zuerst wird der boolesche Wert true (auf der rechten Seite) in die Zahl 1 umgewandelt, und der Vergleich wird erneut durchgeführt. Dann wird der String »1« (auf der linken Seite) in die Zahl 1 umgewandelt. Da beide Werte jetzt gleich sind, liefert der Vergleich als Ergebnis true.
4.9.2Vergleichsoperatoren
Die Vergleichsoperatoren testen die relative Reihenfolge (numerisch oder alphabetisch) ihrer beiden Operanden:
Kleiner als (<)
Der Operator < wird zu true ausgewertet, wenn sein erster Operand kleiner als sein zweiter Operand ist; andernfalls wird er zu false ausgewertet.
Größer als (>)
Der Operator > wird zu true ausgewertet, wenn sein erster Operand größer als sein zweiter Operand ist; andernfalls wird er zu false ausgewertet.
Kleiner gleich (<=)
Der Operator <= wird zu true ausgewertet, wenn sein erster Operand kleiner als oder gleich seinem zweiten Operanden ist; andernfalls wird er zu false ausgewertet.
Größer gleich (>=)
Der Operator >= wird zu true ausgewertet, wenn sein erster Operand größer als oder gleich dem zweiten Operanden ist; andernfalls wird er zu false ausgewertet.
Die Operanden dieser Vergleichsoperatoren dürfen beliebigen Typs sein. Vergleiche können jedoch nur auf Zahlen und Strings durchgeführt werden. Operanden, die weder Strings noch Zahlen sind, werden also umgewandelt.
Vergleich und Umwandlung erfolgen nach diesen Regeln:
Wird einer der Operanden zu einem Objekt ausgewertet, wird dieses so in einen primitiven Wert umgewandelt, wie es am Ende von 3.9.3 beschrieben wurde: Liefert die valueOf()-Methode einen primitiven Wert, wird dieser genommen, andernfalls der Rückgabewert der Methode toString().