Typkonvertierung
Aktualisiert: November 2007
Als Typkonvertierung wird der Prozess bezeichnet, bei dem ein Wert aus einem Typ in einen anderen umgewandelt wird. Beispielsweise kann die Zeichenfolge "1234" in eine Zahl konvertiert werden. Darüber hinaus können Sie Daten eines beliebigen Typs in den String-Typ konvertieren. Bestimmte Typkonvertierungen schlagen immer fehl. Beispielsweise kann ein Date-Objekt nicht in ein ActiveXObject-Objekt konvertiert werden.
Bei Typkonvertierungen kann es sich entweder um eine Erweiterungs- oder eine Eingrenzungskonvertierung handeln. Bei Erweiterungskonvertierungen tritt nie ein Überlauf auf, und sie werden immer erfolgreich ausgeführt, während Eingrenzungskonvertierungen mit einem möglichen Informationsverlust verbunden sind und fehlschlagen können.
Beide Konvertierungstypen können explizit (mit dem Datentypbezeichner) oder implizit (ohne Datentypbezeichner) vorgenommen werden. Eine gültige explizite Konvertierung ist immer erfolgreich, auch wenn sie zu Datenverlusten führt. Implizite Konvertierungen sind nur dann erfolgreich, wenn der Prozess keine Daten verliert. Andernfalls schlagen sie fehl und generieren einen Compiler- oder Laufzeitfehler.
Bei Konvertierungen treten Datenverluste auf, wenn der Quelldatentyp keine offensichtliche Entsprechung im Zieldatentyp hat. Beispielsweise kann die Zeichenfolge "Fred" nicht in eine Zahl konvertiert werden. In diesen Fällen wird von der Funktion für die Typkonvertierung ein Standardwert zurückgegeben. Für den Number-Typ ist der Standardwert NaN; für den int-Typ ist der Standardwert die Zahl 0.
Einige Typen von Konvertierungen sind zeitaufwendig, z. B. Konvertierungen aus einer Zeichenfolge in eine Zahl. Je weniger Konvertierungen in einem Programm verwendet werden, desto effektiver arbeitet das Programm.
Implizite Konvertierungen
Die meisten Typkonvertierungen, z. B. das Zuweisen eines Werts zu einer Variablen, erfolgen automatisch. Der Datentyp der Variablen bestimmt den Zieldatentyp der Konvertierung des Ausdrucks.
Das folgende Beispiel veranschaulicht, wie Daten implizit zwischen einem int-, einem string- und einem double-Wert konvertiert werden können.
var i : int;
var d : double;
var s : String;
i = 5;
s = i; // Widening: the int value 5 coverted to the String "5".
d = i; // Widening: the int value 5 coverted to the double 5.
s = d; // Widening: the double value 5 coverted to the String "5".
i = d; // Narrowing: the double value 5 coverted to the int 5.
i = s; // Narrowing: the String value "5" coverted to the int 5.
d = s; // Narrowing: the String value "5" coverted to the double 5.
Beim Kompilieren dieses Codes werden möglicherweise Warnungen zur Kompilierzeit ausgegeben, in denen Sie auf das mögliche Fehlschlagen oder auf mögliche Geschwindigkeitseinbußen bei den Eingrenzungskonvertierungen hingewiesen werden.
Implizite Eingrenzungskonvertierungen funktionieren u. U. nicht, wenn die Konvertierung mit einem Datenverlust verbunden ist. Die folgenden Codezeilen funktionieren z. B. nicht.
var i : int;
var f : float;
var s : String;
f = 3.14;
i = f; // Run-time error. The number 3.14 cannot be represented with an int.
s = "apple";
i = s; // Run-time error. The string "apple" cannot be converted to an int.
Explizite Konvertierungen
Wenn ein Ausdruck explizit in einen bestimmten Datentyp konvertiert werden soll, verwenden Sie den Datentypbezeichner und fügen den zu konvertierenden Ausdruck in Klammern an. Explizite Konvertierungen erfordern längere Eingaben als implizite Konvertierungen, aber das Ergebnis ist besser vorhersehbar. Außerdem können bei expliziten Konvertierungen auch Konvertierungen mit Informationsverlusten behandelt werden.
Das folgende Beispiel veranschaulicht, wie Daten explizit zwischen einem int-, einem string- und einem double-Wert konvertiert werden können.
var i : int;
var d : double;
var s : String;
i = 5;
s = String(i); // Widening: the int value 5 coverted to the String "5".
d = double(i); // Widening: the int value 5 coverted to the double 5.
s = String(d); // Widening: the double value 5 coverted to the String "5".
i = int(d); // Narrowing: the double value 5 coverted to the int 5.
i = int(s); // Narrowing: the String value "5" coverted to the int 5.
d = double(s); // Narrowing: the String value "5" coverted to the double 5.
Explizite Eingrenzungskonvertierungen werden meist selbst dann erfolgreich ausgeführt, wenn die Konvertierung mit einem Datenverlust verbunden ist. Sie können mit der expliziten Konvertierung zwischen inkompatiblen Datentypen konvertieren. Beispielweise können Date‑Daten nicht in RegExp‑Daten konvertiert werden, und umgekehrt. Darüber hinaus sind Konvertierungen für bestimmte Werte nicht möglich, da kein vernünftiger Wert vorhanden ist, in den der Wert konvertiert werden kann. So wird beispielsweise ein Fehler ausgegeben, wenn Sie versuchen, den double-Wert NaN explizit in einen decimal-Wert zu konvertieren. Der Grund hierfür ist, dass kein natürlicher decimal-Wert für NaN vorhanden ist.
Im folgenden Beispiel wird eine Zahl mit einem Dezimalteil in eine ganze Zahl und eine Zeichenfolge in eine ganze Zahl konvertiert.
var i : int;
var d : double;
var s : String;
d = 3.14;
i = int(d);
print(i);
s = "apple";
i = int(s);
print(i);
Ausgabe:
3
0
Das Verhalten der expliziten Konvertierung hängt sowohl vom Quelldatentyp als auch vom Zieldatentyp ab.