Typumwandlungen

Eine Typumwandlung tritt auf, wenn ein Wert in den Wert eines anderen Datentyps umgewandelt wird. Typumwandlungen können entweder implizit oder explizit erfolgen. Eine implizite Umwandlung (auch als Coercion bezeichnet) wird manchmal zur Laufzeit von Flash Player oder Adobe AIR durchgeführt. Angenommen einer Variablen des Datentyps „Boolean“ wird der Wert 2 zugeordnet, so wandelt Flash Player oder Adobe AIR den Wert 2 in den booleschen Wert true um, bevor er der Variablen zugewiesen wird. Eine explizite Umwandlung (auch als Casting bezeichnet) tritt auf, wenn der Compiler im Code angewiesen wird, eine Variable eines Datentyps so zu behandeln, als gehöre sie zu einem anderen Datentyp. Sind auch Grundwerte involviert, wandelt Casting die Werte von einem Datentyp in den anderen um. Um ein Objekt in einen anderen Typ umzuwandeln, schließen Sie den Objektnamen in runde Klammern ein und stellen ihm den Namen des neuen Typs voran. Im folgenden Codebeispiel wird ein boolescher Wert in eine Ganzzahl umgewandelt:

var myBoolean:Boolean = true; 
var myINT:int = int(myBoolean); 
trace(myINT); // 1

Implizite Typumwandlungen

Implizite Umwandlungen treten zur Laufzeit in verschiedenen Kontexten auf:

  • In Zuweisungsanweisungen

  • Wenn Werte als Funktionsargumente übergeben werden

  • Wenn Werte von Funktionen zurückgegeben werden

  • In Ausdrücken, die bestimmte Operatoren verwenden, z. B. den Additionsoperator (+)

    Implizite Umwandlungen von benutzerdefinierten Typen sind dann erfolgreich, wenn der umzuwandelnde Wert eine Instanz der Zielklasse oder eine von der Zielklasse abgeleitete Klasse ist. Ist eine implizite Umwandlung nicht erfolgreich, tritt ein Fehler auf. Der folgende Code enthält beispielsweise eine erfolgreiche implizite Umwandlung und eine nicht erfolgreiche implizite Umwandlung:

    class A {} 
    class B extends A {} 
     
    var objA:A = new A(); 
    var objB:B = new B(); 
    var arr:Array = new Array(); 
     
    objA = objB; // Conversion succeeds. 
    objB = arr; // Conversion fails.

    Bei Grundtypen werden implizite Umwandlungen durch Aufrufen der gleichen internen Umwandlungsalgorithmen bearbeitet, die auch für explizite Umwandlungen verwendet werden. In den folgenden Abschnitten wird die Umwandlung dieser Grundtypen ausführlich beschrieben.

Explizite Umwandlungen

Beim Kompilieren im strikten Modus sollten Sie explizite Umwandlungen (Casting) verwenden, da u. U. verhindert werden soll, dass eine Typdiskrepanz einen Kompilierungsfehler erzeugt. Dies ist z. B. der Fall, wenn Sie wissen, dass die Coercion Ihre Werte zur Laufzeit korrekt umwandelt. Wenn Sie beispielsweise mit Daten arbeiten, die von einem Formular übergeben werden, soll die Umwandlung von bestimmten Stringwerten zu numerischen Werten von der Coercion ausgeführt werden. Der folgende Code erzeugt einen Laufzeitfehler, obwohl er im Standardmodus korrekt ausgeführt werden würde:

var quantityField:String = "3"; 
var quantity:int = quantityField; // compile time error in strict mode

Wenn Sie weiterhin den strikten Modus verwenden, den String aber in eine Ganzzahl umwandeln möchten, können Sie die explizite Umwandlung verwenden. Dazu verwenden Sie folgenden Code:

var quantityField:String = "3"; 
var quantity:int = int(quantityField); // Explicit conversion succeeds.

Umwandlung in die Datentypen „int“, „uint“ und „Number“

Sie können jeden Datentyp in einen der drei Datentypen für Zahlen (int, uint und Number) umwandeln. Kann Flash Player oder Adobe AIR die Zahl nicht umwandeln, wird der Standardwert 0 für die Datentypen „int“ und „uint“ und der Standardwert NaN für den Datentyp „Number“ zugewiesen. Wenn Sie einen booleschen Wert in eine Zahl umwandeln, wird true in den Wert 1 und false in den Wert 0 umgewandelt.

var myBoolean:Boolean = true; 
var myUINT:uint = uint(myBoolean); 
var myINT:int = int(myBoolean); 
var myNum:Number = Number(myBoolean); 
trace(myUINT, myINT, myNum); // 1 1 1 
myBoolean = false; 
myUINT = uint(myBoolean); 
myINT = int(myBoolean); 
myNum = Number(myBoolean); 
trace(myUINT, myINT, myNum); // 0 0 0

Stringwerte, die nur Ziffern enthalten, können in einen der anderen Datentypen für Zahlen umgewandelt werden. Die Datentypen für Zahlen können auch Strings umwandeln, die wie negative Zahlen aussehen oder einen Hexadezimalwert darstellen (z. B. 0x1A). Beim Umwandlungsprozess werden vor- und nachgestellte Leerzeichen in Stringwerten ignoriert. Mit Number() können Sie auch Strings umwandeln, die Textdarstellungen von Gleitkommazahlen sind. Beim Einfügen eines Dezimalzeichens wird mit uint() und int() eine Ganzzahl zurückgegeben, bei der die Ziffern und Zeichen hinter der Dezimalstelle abgeschnitten sind. Die folgenden Stringwerte können beispielsweise in Zahlen umgewandelt werden:

trace(uint("5")); // 5 
trace(uint("-5")); // 4294967291. It wraps around from MAX_VALUE 
trace(uint(" 27 ")); // 27 
trace(uint("3.7")); // 3 
trace(int("3.7")); // 3 
trace(int("0x1A")); // 26 
trace(Number("3.7")); // 3.7

Stringwerte, die keine numerischen Zeichen enthalten, geben 0 zurück, wenn sie mit int() oder uint() umgewandelt werden, und NaN, wenn die Umwandlung mit Number() erfolgt. Der Umwandlungsprozess ignoriert vor- und nachgestellte Leerzeichen, gibt aber 0 oder NaN zurück, wenn die Zeichenfolge Leerstellen enthält, die zwei Zahlen voneinander trennen.

trace(uint("5a")); // 0 
trace(uint("ten")); // 0 
trace(uint("17 63")); // 0

In ActionScript 3.0 unterstützt die Number()-Funktion keine Oktal- oder Basis 8-Zahlen. Wenn Sie in ActionScript 2.0 eine Zeichenfolge mit einer vorgestellten Null an die Number()-Funktion übergeben, wird die Zahl als Oktalzahl interpretiert und in den entsprechenden Dezimalwert umgewandelt. Dies ist in ActionScript 3.0 bei der Number()-Funktion nicht der Fall. Hier wird die vorgestellte Null stattdessen ignoriert. Mit dem folgenden Code wird beispielsweise je nach verwendeter ActionScript-Version eine andere Ausgabe erzeugt:

trace(Number("044"));  
// ActionScript 3.0 44 
// ActionScript 2.0 36

Eine Typumwandlung (Casting) ist nicht erforderlich, wenn ein Wert eines numerischen Typs einer Variablen mit einem anderen numerischen Typ zugewiesen wird. Auch im strikten Modus werden numerische Datentypen implizit in andere numerische Datentypen umgewandelt. Dies führt in einigen Fällen dazu, dass sich unerwartete Werte einstellen, wenn der Bereich eines Datentyps überschritten wird. Die folgenden Beispiele werden alle im strikten Modus kompiliert, obwohl einige unerwartete Werte erzeugen werden:

var myUInt:uint = -3; // Assign int/Number value to uint variable 
trace(myUInt); // 4294967293 
 
var myNum:Number = sampleUINT; // Assign int/uint value to Number variable 
trace(myNum) // 4294967293 
 
var myInt:int = uint.MAX_VALUE + 1; // Assign Number value to uint variable 
trace(myInt); // 0 
 
myInt = int.MAX_VALUE + 1; // Assign uint/Number value to int variable 
trace(myInt); // -2147483648

In der folgenden Tabelle sind die Ergebnisse der Umwandlung von Datentypen in den Datentyp „Number“, „int“ oder „uint“ aufgeführt.

Datentyp oder Wert

Ergebnis der Umwandlung in „Number“, „int“ oder „uint“

Boolean

Wenn der Wert true ist, 1; andernfalls 0.

Date

Die interne Darstellung des Date-Objekts gibt die Anzahl der Millisekunden an, die seit dem 1. Januar 1970, 0:00 Uhr Weltzeit verstrichen sind.

null

0

Object

Wenn die Instanz null lautet und in den Datentyp „Number“ umgewandelt wird, NaN; andernfalls 0.

String

Eine Zahl, wenn Flash Player oder Adobe AIR den String in eine Zahl umwandeln kann; NaN, wenn der String in den Datentyp „Number“ umgewandelt wird, oder 0, wenn der String in den Datentyp „int“ oder „uint“ umgewandelt wird.

undefined

Wenn in den Datentyp „Number“ umgewandelt wird, NaN; wenn in den Datentyp „int“ oder „uint“ umgewandelt wird, 0.

Umwandlung in den Boolean-Datentyp

Durch die Umwandlung eines beliebigen numerischen Datentyps (uint, int und Number) in den Datentyp „Boolean“ wird false zurückgegeben, wenn der numerische Wert 0 lautet. Andernfalls wird true zurückgegeben. Beim Datentyp „Number“ gibt der Wert NaN ebenfalls false zurück. Im folgenden Beispiel sind die Ergebnisse der Umwandlung der Zahlen -1, 0 und 1 dargestellt:

var myNum:Number; 
for (myNum = -1; myNum<2; myNum++) 
{ 
    trace("Boolean(" + myNum +") is " + Boolean(myNum)); 
}

Im folgenden Beispiel wird veranschaulicht, dass nur eine der drei Zahlen (0) den Wert false zurückgibt:

Boolean(-1) is true 
Boolean(0) is false 
Boolean(1) is true

Beim Umwandeln eines Stringwerts in einen booleschen Wert wird false zurückgegeben, wenn der String null lautet oder es sich um einen leeren String ("") handelt. Andernfalls wird true zurückgegeben.

var str1:String; // Uninitialized string is null. 
trace(Boolean(str1)); // false 
 
var str2:String = ""; // empty string 
trace(Boolean(str2)); // false 
 
var str3:String = " "; // white space only 
trace(Boolean(str3)); // true

Bei der Umwandlung der Instanz einer Object-Klasse in den Datentyp „Boolean“ wird false zurückgegeben, wenn die Instanz null lautet. Andernfalls wird true zurückgegeben:

var myObj:Object; // Uninitialized object is null. 
trace(Boolean(myObj)); // false 
 
myObj = new Object(); // instantiate  
trace(Boolean(myObj)); // true

Variablen des Typs „Boolean“ erfahren im strikten Modus eine Sonderbehandlung, d. h. Sie können einer booleschen Variablen ohne Umwandlung (Casting) Werte jedes Datentyps zuweisen. Die implizite Coercion aus allen Datentypen in den Datentyp „Boolean“ tritt sogar im strikten Modus auf. Anders ausgedrückt, im Gegensatz zu fast allen anderen Datentypen ist eine Umwandlung in den Datentyp „Boolean“ nicht erforderlich, um Fehler im strikten Modus zu vermeiden. Die folgenden Beispiele werden alle im strikten Modus kompiliert und verhalten sich zur Laufzeit wie erwartet:

var myObj:Object = new Object(); // instantiate  
var bool:Boolean = myObj; 
trace(bool); // true 
bool = "random string"; 
trace(bool); // true 
bool = new Array(); 
trace(bool); // true 
bool = NaN; 
trace(bool); // false

In der folgenden Tabelle sind die Ergebnisse der Umwandlung eines Datentyps in den Datentyp „Boolean“ aufgeführt:

Datentyp oder Wert

Ergebnis der Umwandlung in den Datentyp „Boolean“

String

false, wenn der Wert null lautet oder eine leere Zeichenfolge ist (""); andernfalls true.

null
false

Number, int oder uint

false, wenn der Wert NaN oder 0 ist, andernfalls true.

Object

false, wenn die Instanz null ist, andernfalls true.

Umwandlung in einen String-Datentyp

Durch die Umwandlung eines beliebigen numerischen Datentyps in den Datentyp „String“ wird eine Stringdarstellung der Zahl zurückgegeben. Die Umwandlung eines booleschen Werts in den Datentyp „String“ gibt den String true zurück, wenn der Wert true lautet, oder den String false, wenn der Wert false lautet.

Die Umwandlung einer Instanz der Object-Klasse in den Datentyp „String“ gibt den String null zurück, wenn die Instanz null lautet. Andernfalls gibt die Umwandlung einer Object-Klasse in den Datentyp „String“ den String [object Object] zurück.

Die Umwandlung einer Instanz der Array-Klasse in den Datentyp „String“ gibt einen String zurück, der aus einer kommagetrennten Liste aller Array-Elemente besteht. Beispielsweise gibt die folgende Umwandlung in den Datentyp „String“ einen String zurück, der alle drei Elemente des folgenden Arrays enthält:

var myArray:Array = ["primary", "secondary", "tertiary"]; 
trace(String(myArray)); // primary,secondary,tertiary

Die Umwandlung einer Instanz der Date-Klasse in den Datentyp „String“ gibt eine Stringdarstellung des Datums zurück, das die Instanz enthält. Im folgenden Code wird eine Stringdarstellung der Date-Klasseninstanz zurückgegeben (die Ausgabe zeigt das Ergebnis für die Pacific Daylight Time):

var myDate:Date = new Date(2005,6,1); 
trace(String(myDate)); // Fri Jul 1 00:00:00 GMT-0700 2005

In der folgenden Tabelle sind die Ergebnisse der Umwandlung eines Datentyps in den Datentyp „String“ aufgeführt:

Datentyp oder Wert

Ergebnis der Umwandlung in den Datentyp „String“

Array

Ein String, der alle Array-Elemente enthält.

Boolean

true oder false

Date

Die Stringdarstellung des Date-Objekts.

null
"null"

Number, int oder uint

Die Stringdarstellung der Zahl.

Object

Wenn die Instanz „null“ ist, null; andernfalls [object Object].