Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 61
Algorithmen zur Umwandlung von Objekten in primitive Datentypen
ОглавлениеNachdem wir nun die toString()- und valueOf()-Methoden besprochen haben, können wir grob erklären, wie die drei Objekt-zu-Primitivwert-Umwandlungsalgorithmen funktionieren (die vollständigen Details stellen wir zurück bis 14.4.7):
Der prefer-string-Algorithmus versucht zunächst, die toString()-Methode auszuführen. Falls die Methode definiert ist und einen primitiven Wert zurückgibt, verwendet JavaScript diesen primitiven Wert (auch wenn es kein String ist!). Falls toString() nicht existiert oder wenn sie ein Objekt zurückgibt, versucht JavaScript als Nächstes, die Methode valueOf() auszuführen. Falls diese Methode existiert und einen primitiven Wert zurückgibt, verwendet JavaScript diesen Wert. Andernfalls schlägt die Umwandlung mit einem TypeError fehl.
Der prefer-number-Algorithmus funktioniert wie der prefer-string-Algorithmus, abgesehen davon, dass er zuerst valueOf() und dann erst toString() ausprobiert.
Der no-preference-Algorithmus orientiert sich an der Klasse des umzuwandelnden Objekts. Falls es sich um ein Date-Objekt handelt, verwendet JavaScript den prefer-string-Algorithmus. Bei allen anderen Objekten verwendet JavaScript den prefer-number-Algorithmus.
Die hier beschriebenen Regeln gelten für alle integrierten JavaScript-Typen und auch als Standardregeln für alle von Ihnen selbst definierten Klassen. 14.4.7 erläutert, wie Sie Ihre eigenen Objekt-zu-Primitivwert-Umwandlungsalgorithmen für von Ihnen definierte Klassen festlegen können.
Bevor wir dieses Thema verlassen, sei darauf hingewiesen, dass die Details der prefer-number-Konvertierung auch erklären, warum leere Arrays in die Zahl 0 umgewandelt werden und Arrays mit nur einem Element in Zahlen konvertiert werden können:
Number([]) // => 0: Das ist unerwartet!
Number([99]) // => 99: Tatsächlich?
Bei der Umwandlung von Objekten in Zahlen wird ein Objekt zunächst mithilfe des prefer-number-Algorithmus in einen primitiven Wert umgewandelt, bevor der resultierende Primitivwert in eine Zahl konvertiert wird. Der prefer-number-Algorithmus versucht zuerst, valueOf() auszuführen, bevor auf toString() zurückgegriffen wird. Die Klasse Array erbt aber die Standardmethode valueOf(), die keinen primitiven Wert zurückgibt. Wenn wir also versuchen, ein Array in eine Zahl zu konvertieren, rufen wir letztlich die toString()-Methode des Arrays auf. Leere Arrays werden in den leeren String konvertiert. Und der leere String wird in die Zahl 0 umgewandelt. Ein Array mit nur einem Wert wird in genau den String umgewandelt, in den auch dieses Element umgewandelt wird. Enthält ein Array nur eine einzelne Zahl, wird diese Zahl in einen String umgewandelt, der dann wiederum in eine Zahl zurückgewandelt wird.