Datentypen

Ein Datentyp definiert Werte. Beispielsweise lässt der Datentyp „Boolean“ zwei Werte zu: true und false. Neben dem Datentyp „Boolean“ definiert ActionScript 3.0 weitere häufig verwendete Datentypen wie „String“, „Number“ und „Array“. Sie können Ihre eigenen Datentypen definieren, indem Sie benutzerdefinierte Werte mit Klassen oder Schnittstellen definieren. Alle Werte in ActionScript 3.0 sind Objekte, unabhängig davon, ob es sich um Grundwerte oder um komplexe Werte handelt.

Ein Grundwert ist ein Wert, der einem der folgenden Datentypen angehört: „Boolean“, „int“, „Number“, „String“ und „uint“. Vorgänge mit Grundwerten sind in der Regel schneller als Vorgänge mit komplexen Werten, da Grundwerte in ActionScript so gespeichert werden, dass Speicher- und Geschwindigkeitsoptimierungen möglich sind.

Hinweis: Falls Sie Interesse an den technischen Details haben: ActionScript speichert Grundwerte intern als unveränderliche Objekte. Da sie als unveränderliche Objekte gespeichert werden, ist die Übergabe über einen Verweis genauso effektiv wie die Übergabe über einen Wert. Dies belegt weniger Speicher und erhöht die Ausführungsgeschwindigkeit, da Verweise in der Regel deutlich kleiner sind als die Werte selbst.

Ein komplexer Wert ist ein Wert, bei dem es sich nicht um einen Grundwert handelt. Zu den Datentypen, die komplexe Werte definieren, gehören „Array“, „Date“, „Error“, „Function“, „RegExp“, „XML“ und „XMLList“.

Viele Programmiersprachen unterscheiden zwischen Grundwerten und deren Wrapper-Objekten. Beispielsweise verfügt Java über einen int-Grundwert und eine java.lang.Integer-Klasse, die als Wrapper dient. Java-Grundwerte sind im Gegensatz zu ihren Wrappern keine Objekte. Dadurch eignen sich Grundwerte für einige Vorgänge gut, während Wrapper-Objekte für andere Vorgänge besser geeignet sind. In ActionScript 3.0 wird aus praktischen Gründen nicht zwischen Grundwerten und deren Wrapper-Objekten unterschieden. Alle Werte, auch Grundwerte, sind Objekte. Die Laufzeit behandelt diese Grundtypen als Sonderfälle, die sich wie Objekte verhalten, aber nicht den normalen Aufwand zum Erstellen von Objekten erfordern. Das heißt, dass die beiden folgenden Anweisungen gleichwertig sind:

var someInt:int = 3; 
var someInt:int = new int(3);

Alle oben aufgeführten Grund- und komplexen Datentypen sind durch die ActionScript 3.0-Kernklassen definiert. Mit den Kernklassen können Sie Objekte mit Literalwerten erstellen, ohne dass Sie den new-Operator verwenden müssen. Beispielsweise können Sie ein Array mit einem Literalwert oder dem Array-Klassenkonstruktor erstellen, wie im Folgenden dargestellt:

var someArray:Array = [1, 2, 3]; // literal value 
var someArray:Array = new Array(1,2,3); // Array constructor

Typüberprüfung

Die Typüberprüfung kann während der Kompilierung oder zur Laufzeit erfolgen. Statisch typisierte Sprachen wie C++ und Java führen die Typüberprüfung während der Kompilierung durch. Dynamisch typisierte Sprachen wie Smalltalk und Python führen die Typüberprüfung zur Laufzeit durch. Als dynamisch typisierte Sprache führt ActionScript 3.0 die Typüberprüfung zur Laufzeit durch, unterstützt mit einem speziellen Compiler-Modus namens strikter Modus aber auch eine Typüberprüfung während der Kompilierung. Im strikten Modus wird die Typüberprüfung sowohl während der Kompilierung als auch zur Laufzeit durchgeführt, im Standardmodus wird sie nur zur Laufzeit durchgeführt.

Dynamisch typisierte Sprachen bieten zwar eine hohe Flexibilität beim Strukturieren Ihres Codes, dafür werden Typfehler erst zur Laufzeit festgestellt. Statisch typisierte Sprachen melden Typfehler bereits während der Kompilierung. Dazu müssen die Typinformationen jedoch bereits zur Kompilierung bekannt sein.

Typüberprüfung während der Kompilierung

Die Typüberprüfung während der Kompilierung wird insbesondere bei größeren Projekten bevorzugt, da die Datentypflexibilität mit wachsender Projektgröße weniger wichtig als das rechtzeitige Erfassung von Typfehlern wird. Aus diesem Grund ist der ActionScript-Compiler in Flash Professional und Flash Builder standardmäßig auf den strikten Modus eingestellt.

Adobe Flash Builder

Sie können den strikten Modus in Flash Builder über die Einstellungen des ActionScript-Compilers im Dialogfeld für Projekteigenschaften deaktivieren.

Der Compiler muss die Datentypinformationen der Variablen oder Ausdrücke in Ihrem Code kennen, um eine Typüberprüfung während der Kompilierung durchführen zu können. Um einen Datentyp für eine Variable explizit zu deklarieren, fügen Sie den Doppelpunktoperator (:) gefolgt vom Datentyp als Suffix zum Variablennamen hinzu. Um einem Parameter einen Datentyp zuzuordnen, verwenden Sie den Doppelpunktoperator gefolgt vom Datentyp. Im folgenden Code werden dem Parameter xParam Datentypinformationen hinzugefügt. Zudem wird eine Variable myParam mit einem expliziten Datentyp deklariert:

function runtimeTest(xParam:String) 
{ 
    trace(xParam); 
} 
var myParam:String = "hello"; 
runtimeTest(myParam);

Im strikten Modus meldet der ActionScript-Compiler Typdiskrepanzen als Compiler-Fehler. Im folgenden Code wird ein Funktionsparameter xParam des Typs „Object“ deklariert, im weiteren Verlauf wird jedoch versucht, diesem Parameter Werte des Typs „String“ und „Number“ zuzuweisen. Im strikten Modus führt dies zu einem Compiler-Fehler.

function dynamicTest(xParam:Object) 
{ 
    if (xParam is String) 
    { 
        var myStr:String = xParam; // compiler error in strict mode 
        trace("String: " + myStr); 
    } 
    else if (xParam is Number) 
    { 
        var myNum:Number = xParam; // compiler error in strict mode 
        trace("Number: " + myNum); 
    } 
}

Auch im strikten Modus können Sie die Typüberprüfung während der Kompilierung selektiv deaktivieren, indem Sie die rechte Seite einer Zuweisungsanweisung nicht typisieren. Um eine Variable oder einen Ausdruck als nicht typisiert zu kennzeichnen, lassen Sie entweder die Typanmerkung weg oder verwenden die Sondertypanmerkung * (Sternchen). Wenn beispielsweise der xParam-Parameter aus dem vorherigen Beispiel so geändert wird, dass er keine Typanmerkung mehr aufweist, wird der Code im strikten Modus kompiliert:

function dynamicTest(xParam) 
{ 
    if (xParam is String) 
    { 
        var myStr:String = xParam; 
        trace("String: " + myStr); 
    } 
    else if (xParam is Number) 
    { 
        var myNum:Number = xParam; 
        trace("Number: " + myNum); 
    } 
} 
dynamicTest(100) 
dynamicTest("one hundred");

Typüberprüfung zur Laufzeit

Die Typüberprüfung zur Laufzeit findet in ActionScript 3.0 unabhängig davon statt, ob Sie im strikten Modus oder im Standardmodus kompilieren. Stellen Sie sich eine Situation vor, bei der der Wert 3 als Argument an eine Funktion übergeben wird, die ein Array erwartet. Im strikten Modus erzeugt der Compiler einen Fehler, weil der Wert 3 nicht mit dem Datentyp „Array“ kompatibel ist. Wenn Sie den strikten Modus deaktivieren und den Standardmodus ausführen, meldet der Compiler keine Typdiskrepanzen, aber eine Typüberprüfung zur Laufzeit führt zu einem Laufzeitfehler.

Im folgenden Beispiel ist eine Funktion namens typeTest() dargestellt, die ein Array-Argument erwartet, stattdessen jedoch den Wert 3 empfängt. Dies führt im Standardmodus zu einem Laufzeitfehler, da der Wert 3 kein Mitglied des deklarierten Datentyps des Parameters (Array) ist.

function typeTest(xParam:Array) 
{ 
    trace(xParam); 
} 
var myNum:Number = 3; 
typeTest(myNum);  
// run-time error in ActionScript 3.0 standard mode

Es gibt auch Situationen, in denen ein Laufzeitfehler erzeugt wird, obwohl Sie im strikten Modus arbeiten. In einem solchen Fall haben Sie den strikten Modus verwendet, die Typüberprüfung während der Kompilierung jedoch durch das Verwenden einer nicht typisierten Variablen ausgeschaltet. Durch Verwenden einer nicht typisierten Variablen wird die Typüberprüfung nicht deaktiviert, sondern bis zur Laufzeit zurückgestellt. Angenommen, die myNum-Variable aus dem vorhergehenden Beispiel weist keinen deklarierten Datentyp auf. In diesem Fall kann der Compiler keine Typdiskrepanz erkennen, es wird jedoch ein Laufzeitfehler erzeugt, da der Laufzeitwert von myNum (der als Ergebnis der Zuweisungsanweisung auf 3 festgelegt ist) mit dem Datentyp von xParam verglichen wird, der auf „Array“ gesetzt ist.

function typeTest(xParam:Array) 
{ 
    trace(xParam); 
} 
var myNum = 3; 
typeTest(myNum);  
// run-time error in ActionScript 3.0

Die Typüberprüfung zur Laufzeit ermöglicht auch eine flexiblere Verwendung der Vererbung als die Typüberprüfung während der Kompilierung. Durch das Zurückstellen der Typüberprüfung bis zur Laufzeit können Sie im Standardmodus auch dann auf die Eigenschaften einer Unterklasse verweisen, wenn Sie verallgemeinern (upcast). Eine Verallgemeinerung findet statt, wenn Sie eine Basisklasse zum Deklarieren des Typs einer Klasseninstanz verwenden, jedoch eine Unterklasse zum Instanziieren angeben. Beispielsweise können Sie eine Klasse mit dem Namen „ClassBase“ erstellen, die erweitert werden kann (Klassen mit dem Attribut final können nicht erweitert werden):

class ClassBase 
{ 
}

Anschließend können Sie eine Unterklasse von „ClassBase“ namens „ClassExtender“ erstellen, die eine Eigenschaft mit der Bezeichnung someString aufweist. Dies wird im folgenden Code gezeigt:

class ClassExtender extends ClassBase 
{ 
    var someString:String; 
}

Mit beiden Klassen können Sie eine Klasseninstanz erstellen, die mit dem Datentyp „ClassBase“ deklariert ist, jedoch mit dem ClassExtender-Konstruktor instanziiert wird. Eine Verallgemeinerung wird als sichere Operation angesehen, da die Basisklasse keine Eigenschaften oder Methoden enthält, die nicht in der Unterklasse vorhanden sind.

var myClass:ClassBase = new ClassExtender();

Eine Unterklasse kann jedoch Eigenschaften oder Methoden enthalten, die in der Basisklasse nicht enthalten sind. Beispielsweise enthält die ClassExtender-Klasse die Eigenschaft someString, die in der ClassBase-Klasse nicht vorhanden ist. Im Standardmodus von ActionScript 3.0 können Sie mit der myClass-Instanz auf diese Eigenschaft verweisen, ohne einen Fehler während der Kompilierung zu erzeugen. Dies wird im folgenden Beispiel gezeigt:

var myClass:ClassBase = new ClassExtender(); 
myClass.someString = "hello"; 
// no error in ActionScript 3.0 standard mode

is-Operator

Mit dem is-Operator können Sie testen, ob eine Variable oder ein Ausdruck Mitglied eines bestimmten Datentyps ist. In früheren Versionen von ActionScript wurde diese Funktion vom instanceof-Operator bereitgestellt, in ActionScript 3.0 sollte der instanceof-Operator jedoch nicht mehr zum Testen der Datentypmitgliedschaft verwendet werden. Stattdessen sollten Sie zur manuellen Typüberprüfung den is-Operator anstelle des instanceof-Operators verwenden, da der Ausdruck x instanceof y lediglich die Prototypkette von x auf das Vorhandensein von y überprüft (und die Prototypkette in ActionScript 3.0 kein vollständiges Bild der Vererbungshierarchie bietet).

Der is-Operator überprüft die genaue Vererbungshierarchie. Er kann also nicht nur überprüfen, ob ein Objekt eine Instanz einer bestimmten Klasse ist, sondern auch, ob ein Objekt eine Instanz einer Klasse ist, die eine bestimmte Schnittstelle implementiert. Im folgenden Beispiel wird eine Instanz der Sprite-Klasse namens mySprite erstellt und mit dem is-Operator überprüft, ob mySprite eine Instanz der Sprite- und DisplayObject-Klassen ist und ob es die IEventDispatcher-Schnittstelle implementiert:

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

Der is-Operator überprüft die Vererbungshierarchie und meldet unverzüglich, ob mySprite mit den Sprite- und DisplayObject-Klassen kompatibel ist (die Sprite-Klasse ist eine Unterklasse der DisplayObject-Klasse). Außerdem überprüft der is-Operator, ob mySprite von einer der Klassen erbt, welche die IEventDispatcher-Schnittstelle implementieren. Da die Sprite-Klasse von der EventDispatcher-Klasse erbt, die wiederum die IEventDispatcher-Schnittstelle implementiert, meldet der is-Operator folgerichtig, dass mySprite die gleiche Schnittstelle implementiert.

Das folgende Beispiel zeigt die gleichen Tests wie das vorangegangene Beispiel, diesmal jedoch mit dem instanceof-Operator anstelle des is-Operators. Der instanceof-Operator erkennt richtig, dass mySprite eine Instanz von Sprite oder DisplayObject ist, gibt jedoch den Wert false zurück, wenn getestet wird, ob mySprite die IEventDispatcher-Schnittstelle implementiert.

trace(mySprite instanceof Sprite); // true 
trace(mySprite instanceof DisplayObject);// true 
trace(mySprite instanceof IEventDispatcher); // false

as-Operator

Mit dem as-Operator können Sie auch testen, ob ein Ausdruck Mitglied eines bestimmten Datentyps ist. Im Gegensatz zum is-Operator liefert der as-Operator keinen booleschen Wert. Der as-Operator gibt den Wert des Ausdrucks anstelle von true und null anstelle von false zurück. Das folgende Beispiel zeigt, was geschieht, wenn in einem einfachen Fall mit dem as-Operator anstelle des is-Operators überprüft werden soll, ob eine Sprite-Instanz ein Mitglied der Datentypen „DisplayObject“, „IEventDispatcher“ und „Number“ ist.

var mySprite:Sprite = new Sprite(); 
trace(mySprite as Sprite);                 // [object Sprite] 
trace(mySprite as DisplayObject);                 // [object Sprite] 
trace(mySprite as IEventDispatcher);                 // [object Sprite] 
trace(mySprite as Number);                                       // null

Wenn Sie den as-Operator verwenden, muss der Operand auf der rechten Seite ein Datentyp sein. Der Versuch, einen anderen Ausdruck als einen Datentyp als Operanden auf der rechten Seite zu verwenden, führt zu einem Fehler.

Dynamische Klassen

Eine dynamische Klasse definiert ein Objekt, das zur Laufzeit durch das Hinzufügen oder Ändern von Eigenschaften und Methoden verändert werden kann. Eine nicht dynamische Klasse, wie z. B. die String-Klasse, wird als versiegelte Klasse bezeichnet. Einer versiegelten Klasse können keine Eigenschaften oder Methoden zur Laufzeit hinzugefügt werden.

Dynamische Klassen werden mit dem Attribut dynamic beim Deklarieren einer Klasse erstellt. Im folgenden Code wird eine dynamische Klasse namens Protean erstellt:

dynamic class Protean 
{ 
    private var privateGreeting:String = "hi"; 
    public var publicGreeting:String = "hello"; 
    function Protean() 
    { 
        trace("Protean instance created"); 
    } 
}

Wenn Sie später eine Instanz der Protean-Klasse instanziieren, können Sie dieser Instanz außerhalb der Klassendefinition Eigenschaften oder Methoden hinzufügen. Im folgenden Code wird beispielsweise eine Instanz der Protean-Klasse erstellt und der Instanz eine Eigenschaft namens aString sowie eine Eigenschaft namens aNumber hinzugefügt:

var myProtean:Protean = new Protean(); 
myProtean.aString = "testing"; 
myProtean.aNumber = 3; 
trace(myProtean.aString, myProtean.aNumber); // testing 3

Eigenschaften, die Sie der Instanz einer dynamischen Klasse hinzufügen, sind Laufzeit-Entitäten. Daher wird die Typüberprüfung zur Laufzeit durchgeführt. Einer auf diese Weise hinzugefügten Eigenschaft können Sie keine Typanmerkung hinzufügen.

Sie können der myProtean-Instanz auch eine Methode hinzufügen, indem Sie eine Funktion definieren und diese Funktion an eine Eigenschaft der myProtean-Instanz anhängen. Im folgenden Code wird die trace-Anweisung in eine Methode namens traceProtean() verschoben:

var myProtean:Protean = new Protean(); 
myProtean.aString = "testing"; 
myProtean.aNumber = 3; 
myProtean.traceProtean = function () 
{ 
    trace(this.aString, this.aNumber); 
}; 
myProtean.traceProtean(); // testing 3

Auf diese Art erstellte Methoden haben jedoch keinen Zugriff auf private Eigenschaften oder Methoden der Protean-Klasse. Darüber hinaus müssen sogar Verweise auf öffentliche Eigenschaften oder Methoden der Protean-Klasse entweder durch das Schlüsselwort this oder durch den Klassennamen qualifiziert werden. Das folgende Beispiel zeigt, wie die traceProtean()-Methode versucht, auf die privaten und öffentlichen Variablen der Protean-Klasse zuzugreifen.

myProtean.traceProtean = function () 
{ 
    trace(myProtean.privateGreeting); // undefined 
    trace(myProtean.publicGreeting); // hello 
}; 
myProtean.traceProtean();

Beschreibung der Datentypen

Die Grunddatentypen umfassen „Boolean“, „int“, „Null“, „Number“, „String“, „uint“ und „void“. Darüber hinaus definieren die ActionScript-Kernklassen die folgenden komplexen Datentypen: Object, Array, Date, Error, Function, RegExp, XML und XMLList.

Boolean-Datentyp

Der Boolean-Datentyp beinhaltet zwei Werte: true und false. Für Variable des Typ „Boolean“ sind keine anderen Werte zulässig. Der Standardwert einer Boolean-Variablen, die zwar deklariert, jedoch nicht initialisiert wurde, lautet false.

int-Datentyp

Der Datentyp „int“ wird intern als Ganzzahl mit 32 Bit gespeichert und umfasst Ganzzahlen im Bereich von

-2.147.483.648 (-231) bis einschließlich 2.147.483.647 (231 - 1). Frühere Versionen von ActionScript boten lediglich den Datentyp „Number“, der sowohl für Ganzzahlen als auch für Gleitkommazahlen verwendet wurde. In ActionScript 3.0 können Sie jetzt auch auf untergeordnete Maschinentypen für 32-Bit-Ganzzahlen mit und ohne Vorzeichen zugreifen. Wenn für eine Variable keine Gleitkommazahlen erforderlich sind, bietet der Datentyp „int“ eine höhere Geschwindigkeit und Effizienz als der Datentyp „Number“.

Für ganzzahlige Werte außerhalb des Bereichs für int-Werte verwenden Sie den Datentyp „Number“, der Werte zwischen plus/minus 9.007.199.254.740.992 (ganzzahlige Werte mit 53 Bit) verarbeiten kann. Der Standardwert für Variable des Datentyps „int“ lautet 0.

Null-Datentyp

Der Null-Datentyp umfasst nur den Wert null. Dies ist der Standardwert für den Datentyp „String“ und alle Klassen, die komplexe Datentypen definieren. Hierzu gehört auch die Object-Klasse. Keiner der anderen Grunddatentypen, wie „Boolean“, „Number“, „int“ und „uint“, enthält den Wert null. Wenn Sie versuchen, Variablen des Typs „Boolean“, „Number“, „int“ oder „uint“ den Wert null zuzuweisen, wird null zur Laufzeit in den entsprechenden Standardwert umgewandelt. Sie können diesen Datentyp nicht als Typanmerkung verwenden.

Number-Datentyp

In ActionScript 3.0 kann der Datentyp „Number“ Ganzzahlen, vorzeichenlose Ganzzahlen und Gleitkommazahlen darstellen. Um die Leistung zu maximieren, sollten Sie den Datentyp „Number“ jedoch nur für ganzzahlige Werte größer als die Speichergrenze für int- und uint-Typen mit 32 Bit oder für Gleitkommazahlen verwenden. Zum Speichern als Gleitkommazahl müssen Sie mit der Zahl ein Dezimalzeichen angeben. Ohne das Dezimalzeichen wird die Zahl als Ganzzahl gespeichert.

Der Datentyp „Number“ verwendet eine Gleitkommazahl nach dem IEEE Standard for Binary Floating-Point Arithmetic (IEEE-754) mit doppelter Genauigkeit (64 Bit). Dieser Standard legt fest, wie Gleitkommazahlen mit 64 verfügbaren Bits gespeichert werden. Ein Bit legt fest, ob die Zahl positiv oder negativ ist. 11 Bit werden für den Exponenten verwendet, der als Basis 2 gespeichert wird. Die verbleibenden 52 Bit werden zum Speichern des Signifikand (auch als Mantisse bezeichnet) verwendet. Dies ist die Zahl, die durch den Exponenten potenziert wird.

Indem einige Bits zum Speichern eines Exponenten verwendet werden, kann der Datentyp „Number“ wesentlich größere Gleitkommazahlen speichern, als wenn alle Bits für die Mantisse verwendet werden. Würde der Datentyp „Number“ alle 64 Bit zum Speichern der Mantisse verwenden, könnte lediglich eine Zahl in der Größe von 265 -1 gespeichert werden. Indem 11 Bit zum Speichern eines Exponenten verwendet werden, kann der Datentyp „Number“ die Mantisse bis zu einer Potenz von 21023 anheben.

Die Höchst- und Mindestwerte, die der Datentyp „Number“ darstellen kann, sind in den statischen Eigenschaften der Number-Klasse namens Number.MAX_VALUE und Number.MIN_VALUE gespeichert.

Number.MAX_VALUE == 1.79769313486231e+308 
Number.MIN_VALUE == 4.940656458412467e-324

Dieser enorm große Zahlenbereich geht jedoch zu Lasten der Genauigkeit. Der Datentyp „Number“ verwendet 52 Bit zum Speichern der Mantisse. Dadurch sind Zahlen, die mehr als 52 Bit zur exakten Darstellung benötigen, wie z. B. der Bruch 1/3, nur Annäherungen. Wenn die Anwendung Dezimalzahlen mit absoluter Präzision erfordert, benötigen Sie Software, die anstelle von Binär-Gleitkommaarithmetik die Dezimal-Gleitkommaarithmetik verwendet.

Wenn Sie ganzzahlige Werte mit dem Datentyp „Number“ speichern, werden nur die 52 Bit der Mantisse verwendet. Der Datentyp „Number“ verwendet diese 52 Bit sowie ein spezielles verborgenes Bit, um Ganzzahlen im Bereich von -9.007.199.254.740.992 (-253) bis 9.007.199.254.740.992 (253) darzustellen.

Der Wert NaN wird nicht nur als Standardwert für Variablen mit dem Number-Typ verwendet, sondern auch als Ergebnis für jeden Vorgang, der eine Zahl zurückgeben sollte, aber einen anderen Wert liefert. Wenn Sie beispielsweise versuchen, die Quadratwurzel einer negativen Zahl zu berechnen, lautet das Ergebnis NaN. Weitere spezielle Number-Werte sind positive infinity (positive Unendlichkeit) und negative infinity (negative Unendlichkeit).

Hinweis: Das Ergebnis einer Division durch 0 ist nur dann NaN, wenn der Divisor ebenfalls 0 ist. Eine Division durch 0 ergibt den Wert infinity (positive Unendlichkeit), wenn der Dividend positiv ist, oder -infinity (negative Unendlichkeit), wenn der Dividend negativ ist.

String-Datentyp

Der Datentyp „String“ stellt eine Zeichenfolge von 16 Bit dar. Strings werden intern als Unicode-Zeichen im Format UTF-16 gespeichert. Strings sind, ebenso wie in der Programmiersprache Java, unveränderliche Werte. Eine Operation mit einem Stringwert liefert eine neue Instanz des Strings. Der Standardwert für eine Variable, die mit dem Datentyp „String“ deklariert ist, lautet null. Der Wert null ist nicht mit einem leeren String ("") identisch. Beim Wert null ist in der Variablen kein Wert gespeichert; bei einem leeren String enthält die Variable einen Wert, der ein String ohne Zeichen ist.

uint-Datentyp

Der Datentyp „uint“ wird intern als vorzeichenlose Ganzzahl mit 32 Bit gespeichert und enthält Ganzzahlen im Bereich von 0 bis einschließlich 4.294.967.295 (232 - 1). Sie verwenden den Datentyp „uint“ für Sonderfälle, die nicht-negative Ganzzahlen verlangen. Beispielsweise müssen Sie den Datentyp „uint“ zur Darstellung von Farbwerten für Pixel verwenden, da der Datentyp „int“ ein internes Vorzeichen-Bit umfasst, das für die Verarbeitung von Farbwerten nicht geeignet ist. Für ganzzahlige Werte größer als der uint-Höchstwert verwenden Sie den Datentyp „Number“, der ganzzahlige Werte mit 53 Bit verarbeiten kann. Der Standardwert für Variablen des Datentyps „uint“ lautet 0.

Void-Datentyp

Der Datentyp „void“ umfasst nur den Wert undefined. In früheren Versionen von ActionScript war undefined der Standardwert für Instanzen der Object-Klasse. In ActionScript 3.0 lautet der Standardwert für Object-Instanzen null. Wenn Sie versuchen, einer Instanz der Object-Klasse den Wert undefined zuzuweisen, wird der Wert in null umgewandelt. Der Wert undefined kann nur nicht typisierten Variablen zugewiesen werden. Nicht typisierte Variablen sind Variablen, denen entweder eine Typanmerkung fehlt oder die das Sternchen-Symbol (*) als Typanmerkung verwenden. Sie können void nur als Rückgabe-Typanmerkung verwenden.

Object-Datentyp

Der Object-Datentyp wird von der Object-Klasse definiert. Die Object-Klasse dient als Basisklasse für alle Klassendefinitionen in ActionScript. Der Datentyp „Object“ in ActionScript 3.0 unterscheidet sich vom Datentyp „Object“ in früheren Versionen in dreifacher Hinsicht. Zunächst einmal ist der Datentyp „Object“ nicht mehr der Standarddatentyp, der Variablen ohne Typanmerkung zugewiesen wird. Zweitens enthält der Datentyp „Object“ nicht mehr den Wert undefined, der als Standardwert für Object-Instanzen verwendet wurde. Drittens lautet der Standardwert für Instanzen der Object-Klasse in ActionScript 3.0 jetzt null.

In früheren Versionen von ActionScript wurde einer Variablen ohne Typanmerkung automatisch der Datentyp „Object“ zugewiesen. Dies findet in ActionScript 3.0 nicht mehr statt, da ActionScript 3.0 jetzt das Konzept einer wahrhaft nicht typisierten Variablen enthält. Variablen ohne Typanmerkung werden jetzt als nicht typisiert betrachtet. Wenn Sie anderen Programmierern, die Ihren Code lesen, deutlich machen möchten, dass Sie eine Variable absichtlich nicht typisiert haben, können Sie das Sternchen-Symbol (*) als Typanmerkung verwenden. Dies entspricht dem Weglassen einer Typanmerkung. Im folgenden Beispiel sind zwei gleichwertige Anweisungen dargestellt. Beide deklarieren eine nicht typisierte Variable x:

var x 
var x:*

Nur nicht typisierte Variable können den Wert undefined annehmen. Wenn Sie versuchen, einer Variablen mit einem Datentyp den Wert undefined zuzuweisen, wandelt die Laufzeit den Wert undefined in den Standardwert dieses Datentyps um. Bei Instanzen des Object-Datentyps lautet der Standardwert null. Wenn Sie also versuchen, einer Object-Instanz den Wert undefined zuzuweisen, wird der Wert in null umgewandelt.

Typumwandlungen

Eine Typumwandlung tritt auf, wenn ein Wert in den Wert eines anderen Datentyps umgewandelt wird. Typumwandlungen können entweder implizit oder explizit erfolgen. Die implizite Umwandlung, auch als Erzwingung bezeichnet, wird manchmal zur Laufzeit durchgeführt. Wenn beispielsweise einer Variablen mit dem Datentyp „Boolean“ der Wert 2 zugeordnet wird, wird der Wert 2 in den booleschen Wert true umgewandelt, 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.

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. Wenn die Zahl nicht umgewandelt werden kann, wird für die Datentypen „int“ und „uint“ der Standardwert 0 und für den Datentyp „Number“ der Standardwert NaN 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:

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“

Boolesch

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

Objekt

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

String

Eine Zahl, wenn der String in eine Zahl umgewandelt werden kann; andernfalls NaN bei der Umwandlung in den Datentyp „Number“ oder 0 bei der Umwandlung in „int“ oder „uint“.

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.

Objekt

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 aus allen Array-Elementen besteht.

Boolesch

"true" oder "false"

Date

Die Stringdarstellung des Date-Objekts.

null

"null"

Number, int oder uint

Die Stringdarstellung der Zahl.

Objekt

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