JavaScript – Das Handbuch für die Praxis. David Flanagan

Читать онлайн.
Название JavaScript – Das Handbuch für die Praxis
Автор произведения David Flanagan
Жанр Математика
Серия
Издательство Математика
Год выпуска 0
isbn 9783960104926



Скачать книгу

ein Objekt in eine Zeichenkette umgewandelt werden muss, konvertiert JavaScript es zunächst mit dem Algorithmus prefer-string in einen primitiven Typ und wandelt dann – falls nötig – gemäß den Regeln in Tabelle 3-2 den resultierenden Wert in eine Zeichenkette um.

      Diese Art der Konvertierung findet z.B. statt, wenn Sie ein Objekt an eine integrierte Funktion übergeben, die als Argument einen String erwartet, wenn Sie String() als Umwandlungsfunktion aufrufen oder wenn Sie Objekte in Template-Literale interpolieren (siehe 3.3.4).

       Umwandlung von Objekten in Zahlen

      Wenn ein Objekt in eine Zahl umgewandelt werden muss, konvertiert JavaScript es zuerst in einen Primitivwert unter Verwendung des prefer-number-Algorithmus und wandelt dann – falls nötig – den resultierenden Primitivwert in eine Zahl um, wieder den Regeln in Tabelle 3-2 gemäß.

      Auf diese Weise wandeln integrierte JavaScript-Funktionen und -Methoden, die numerische Argumente erwarten, Objektargumente in Zahlen um und ebenfalls die meisten JavaScript-Operatoren, die numerische Operanden erwarten – mit den gleich folgenden Ausnahmen.

       Umwandlungen durch einige spezielle Operatoren

      Operatoren werden ausführlich in Kapitel 4 behandelt. Hier erläutern wir einige spezielle Operatoren, die nicht die zuvor beschriebenen grundlegenden Objekt-zu-String- und Objekt-zu-Zahl-Konvertierungen verwenden.

      Der +-Operator führt numerische Additionen und String-Verkettungen durch. Wenn einer seiner Operanden ein Objekt ist, konvertiert JavaScript beide mithilfe des no-preference-Algorithmus in primitive Werte. Sobald dem Operator zwei primitive Werte vorliegen, prüft er deren Typ. Wenn eines der beiden Argumente eine Zeichenfolge ist, wandelt er das andere ebenfalls in eine Zeichenfolge um und verkettet beide. Andernfalls werden beide Argumente in Zahlen umgewandelt und addiert.

      Die Operatoren == und != führen als sogenannte nicht-strikte Operatoren Gleichheits- und Ungleichheitsprüfungen in einer loseren Weise durch, die Typumwandlungen erlaubt. Wenn ein Operand ein Objekt und der andere ein primitiver Wert ist, konvertieren diese Operatoren das Objekt mit dem no-preference-Algorithmus ebenfalls in einen Primitivwert und vergleichen danach beide.

      Zu guter Letzt vergleichen die relationalen Operatoren <, <=, >, und >= die Reihenfolge ihrer Operanden, die sowohl Zahlen als auch Strings sein dürfen. Wenn einer der Operanden ein Objekt ist, wird er mit dem Algorithmus prefer-number in einen primitiven Wert konvertiert. Allerdings werden im Gegensatz zur Objekt-zu-Zahl-Konvertierung die von prefer-number zurückgegebenen primitiven Werte danach nicht in Zahlen umgewandelt.

      Zu beachten ist außerdem, dass zwar die numerische Darstellung von Datumsobjekten mit < und > sinnvoll vergleichbar ist, die String-Darstellung jedoch nicht. Date-Objekte wandelt der no-preference-Algorithmus in eine Zeichenfolge um. Da JavaScript bei relationalen Operatoren aber den prefer-number-Algorithmus verwendet, können wir mit ihrer Hilfe die Reihenfolge von zwei Date-Objekten vergleichen.

       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

       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