Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 95
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.