Читать книгу JavaScript – Das Handbuch für die Praxis - David Flanagan - Страница 60
Die Methoden toString() und valueOf()
ОглавлениеAlle Objekte erben zwei Konvertierungsmethoden, die bei Objekt-zu-Primitivwert-Umwandlungen verwendet werden, und bevor wir uns den prefer-string-, prefer-number- und no-preference-Umwandlungsalgorithmen zuwenden, müssen wir kurz diese beiden Methoden besprechen.
Die erste Methode ist toString() – sie liefert die String-Darstellung eines Objekts. Die toString()-Standardmethode gibt keinen sonderlich interessanten Wert zurück (obgleich wir ihr in 14.4.3 noch einen Nutzen abgewinnen werden):
({x: 1, y: 2}).toString() // => "[object Object]"
Viele Klassen definieren ihre eigenen Versionen der toString()-Methode. Die toString()-Methode der Klasse Array wandelt beispielsweise alle Array-Elemente in Zeichenketten um und verbindet die resultierenden Strings mit Kommata als Trennzeichen. Die toString()-Methode der Klasse Function konvertiert benutzerdefinierte Funktionen in Zeichenketten mit JavaScript-Quellcode. Die Date-Klasse definiert eine toString()-Methode, die eine Datums- und Zeitangabe als String in einer von Menschen lesbaren Form zurückgibt, die von JavaScript geparst werden kann. Die RegExp-Klasse definiert eine toString()-Methode, die eine String-Darstellung des RegExp-Objekts zurückgibt:
[1,2,3].toString() // => "1,2,3"
(function(x) { f(x); }).toString() // => "function(x) { f(x); }"
/\d+/g.toString() // => "/\\d+/g"
let d = new Date(2020,0,1);
d.toString() // => "Wed Jan 01 2020 00:00:00 GMT-0800
// (mitteleuropäische Normalzeit)"
Die andere Methode zur Umwandlung von Objekten heißt valueOf(). Die Aufgabe dieser Methode ist weniger genau definiert: Es wird erwartet, dass sie ein Objekt in einen primitiven Wert umwandelt, der das Objekt repräsentiert, falls ein derartiger primitiver Wert existiert. Objekte sind zusammengesetzte Werte, weshalb die meisten Objekte nicht wirklich durch einen einzelnen primitiven Wert repräsentiert werden können. Deswegen liefert die valueOf()-Standardmethode einfach das Objekt selbst zurück und keinen primitiven Wert. Wrapper-Klassen wie String, Number und Boolean definieren valueOf()-Methoden, die einfach den umhüllten primitiven Wert zurückgeben. Arrays, Funktionen und reguläre Ausdrücke erben schlicht die Standardmethode. Wird valueOf() auf Instanzen dieser Typen aufgerufen, wird einfach das Objekt selbst zurückgeliefert. Die Klasse Date definiert eine valueOf()-Methode, die das Datum in seiner internen Repräsentation liefert: als Anzahl von Millisekunden seit dem 1. Januar 1970:
let d = new Date(2010, 0, 1); // Fri Jan 01 2010 00:00:00 GMT+0100
// (mitteleuropäische Normalzeit)
d.valueOf() // => 1262332800000