7.2 Datentypen
Hier klicken, um das Bild zu Vergrößern
Abbildung 7.1
Primitive Datentypen beinhalten einen Wert, komplexe Datentypen zeigen auf eine Sammlung von weiteren Datentypen.
Die Daten in einer Anwendung dürfen unterschiedlichen Typs sein. Die Zutaten eines Rezeptes werden ja auch nicht ausschließlich in Gramm, sondern ebenfalls in anderen Einheiten wie Liter gemessen.
Kategorien
In Flash sind die Datentypen etwas abstrakter und lassen sich in zwei Kategorien unterteilen:
|
Primitive Datentypen (auch einfache Datentypen, Standard-Datentypen oder Grund-Datentypen genannt) |
|
Komplexe Datentypen (auch zusammengesetzte Datentypen oder Referenz-Datentypen genannt) |
primitive Datentypen
Die primitiven Datentypen beinhalten immer einen konkreten Wert der folgenden Typen:
|
Wahrheitswert (boolean): Dieser Datentyp gibt an, ob etwas wahr oder falsch bzw. an oder aus ist. |
|
Zahl (number): Dieser Datentyp steht in ActionScript sowohl für Ganzzahlen als auch für Gleitkommazahlen. |
|
Zeichenketten (string): Dieser Datentyp steht in ActionScript für Texte. Die zugehörigen Werte werden immer in Anführungszeichen eingeschlossen. |
|
Null: Dieser Datentyp kann mit null nur einen einzigen Wert annehmen. |
|
Undefiniert (undefined): Dieser Datentyp kann mit undefined nur einen einzigen Wert annehmen. |
// Boolescher Wert
maennlich = true;
// Zahl
alter = 29;
// Zeichenkette
name = "Sascha";
komplexe Datentypen
Die komplexen Datentypen sind eine Sammlung weiterer Eigenschaften (darum zusammengesetzte Datentypen) und beinhalten selber keinen Wert, sondern nur einen Zeiger auf die weiteren Daten (darum Referenz-Datentypen), die wiederum von einem beliebigen Typ sein dürfen. Flash unterscheidet hier standardmäßig zwischen den folgenden Typen:
|
Movieclip (movieclip) |
|
Objekt (object) |
|
Funktion (function) |
Dabei darf jeder dieser komplexen Datentypen wieder sämtliche primitive Datentypen wie beispielsweise Zeichenketten und Zahlen und komplexe Datentypen wie Movieclips, Objekte und Funktionen beinhalten – in diesem Fall spricht man bei diesen Wertebehältern nicht mehr von Variablen, sondern von Eigenschaften.
// Movieclip
_root.createEmptyMovieClip("mcBall", 1);
mcBall._x = 100;
mcBall._y = 200;
// Objekt
autor = new Object();
autor.maennlich = true;
autor.alter = 29;
autor.name = "Sascha";
// Funktion
function ermittleMinuten(tage) {
return (tage*24*60);
}
Datentyp ermitteln
Den Datentyp ermitteln Sie entweder innerhalb des Testmodus (Steuerung • Film testen) mit dem Menübefehl Fehlersuche • Variablen auflisten, mit dem Debugger (Steuerung • Fehlersuche) oder über den typeof-Operator:
meineVariable = 123;
trace(typeof meineVariable);
7.2.1 Wahrheitswert (boolean)
Boolesche Werte benötigen Sie immer dann, wenn Daten nur zwei Zustände annehmen können. Umgangssprachlich spricht man bei diesen beiden Zuständen gerne auch von ein und aus oder wahr und falsch (darum auch Wahrheitswerte). Diese beiden Zustände werden durch die Konstanten false und true repräsentiert.
// Variablen vom Typ boolean
bezahlt = false;
// Eigenschaft einer Movieclip-Instanz vom Typ boolean
meinMoviClip._visible = true;
Mathematisch entsprechen die beiden Konstanten false und true den Werten 0 für false und 1 für true. Sie dürfen diese beiden Zahlen auch direkt verwenden. Bei einem strikten Vergleich (siehe »Operatoren« ab Seite 212) kann es dann aber zu Problemen kommen, da der Typ unterschiedlich ist (einmal boolean und einmal number). In der Regel ist das jedoch unerheblich, da Flash automatisch eine passende Typkonvertierung vornimmt.
Boolean-Objekt
Als Alternative zum primitiven Datentyp boolean bietet ActionScript ein Boolean-Objekt, das als komplexer Datentyp dient (siehe Kapitel 13.5, »Objekte«).
7.2.2 Zahl (number)
Punkt statt Komma!
Für Zahlen bietet Flash im Gegensatz zu vielen anderen Programmiersprachen mit number nur einen primitiven Datentyp an. Dieser Datentyp umfasst sowohl Ganzzahlen (engl. Integer) als auch Gleitkommazahlen (engl. Float). Bitte beachten Sie, dass Gleitkommazahlen als Dezimaltrennzeichen im Gegensatz zum deutschsprachigen Komma einen angelsächsischen Dezimalpunkt verwenden!
// Ganzzahlen
alter = 29;
kontostand = -1000;
// Gleitkommazahlen
gewicht = 71.5;
temperatur = -10.5;
Der Zahl-Datentyp verhält sich weitestgehend wie das doppelt genaue 64-Bit-Format IEEE 754 (IEEE-Standard für binäre Gleitkommazahlen-Arithmetik). Dies bedeutet, dass jede Zahl in Flash insgesamt 15 Ziffern haben kann. Das wiederum hat keine Bedeutung bezüglich der Größe, sondern nur bezüglich der Genauigkeit. Denn beispielsweise die Zahl 1e15 (dies bedeutet 1000000000000000) besitzt zwar nur eine Ziffer und ist dennoch größer als 999999999999999. Zahlen mit mehr als 15 Ziffern müssen gerundet werden.
Unterschiedliche Formate für Zahlen
Flash bietet uns nur einen primitiven Datentyp für Zahlen an. Dieser Datentyp verwaltet Werte im IEEE 754-Format mit insgesamt 64 Bit. An einigen anderen Stellen verarbeitet Flash hingegen andere Zahlenformate – meist wird das aber vor uns verborgen, da diese ausschließlich intern abläuft. Beispielsweise vordefinierte Eigenschaften wie _alpha (Transparenz eines Movieclips) scheinen intern ein 16-Bit-Format zu verwenden. Dieses wird jedoch nach außen in Prozent umgerechnet. D.h., 100 entspricht dem internen Wert 255.
Wieder andere Stellen in Flash benutzen 31 Bit plus Vorzeichen. Dazu zählt die Tiefe eines Movieclips. Diese kann immer nur als Ganzzahl zwischen 2147483647 und -2147483647 liegen.
größte darstellbare Zahl
Die größte darstellbare Zahl in Flash ist 179769313486231 * 10308
– also eine Zahl mit insgesamt 309 Stellen vor dem Komma. Jede größere Zahl wird entweder abgerundet oder als Unendlichkeit interpretiert. Übrigens entspricht in ActionScript die Zahl 21024
der Unendlichkeit. Für die niedrigste negative Zahl gilt analog dasselbe.
kleinste darstellbare Zahl
Die kleinste darstellbare Zahl ist 494065645841247 * 10-324
. Falls ich mich nicht verzählt habe, ist das eine Zahl mit insgesamt 348 Nachkommastellen. Jede kleinere Zahl wird entweder aufgerundet oder als 0 angezeigt. Für die kleinste negative Zahl gilt auch hier analog dasselbe.
Tabelle 7.2
Wertebereich von Zahlen
|
Höchste Zahl (positiv)
|
Niedrigste Zahl (negativ)
|
Größte Zahl
|
179769313486231 * 10308
|
-179769313486231 * 10308
|
Kleinste Zahl
|
494065645841247 * 10-324
|
-494065645841247 * 10-324
|
Automatisches Runden von Zahlen
Beachten Sie, dass ActionScript aufgrund der internen Darstellung Zahlen häufig runden muss. Dies entspricht nicht immer den gelernten Regeln aus der Schule und kann deshalb vom erwarteten Ergebnis abweichen. Der Grund dafür ist wie bereits erwähnt die interne Speicherung.
Unendlichkeit
Für die Unendlichkeit bietet ActionScript mit Infinity ein vordefiniertes Schlüsselwort an. -Infinity entspricht der negativen Unendlichkeit. Unendliche Werte deuten meist auf einen Berechnungsfehler hin. Die Division durch null ergibt z.B. unendlich:
// Infinity
trace(1/0);
// -Infinity
trace(-1/0);
trace(Math.log(0));
Not a Number
Die Division durch null ergibt aber nur dann unendlich bzw. negativ unendlich, wenn nicht null durch null geteilt wird. In diesem Fall ist das Ergebnis NaN für »Not a Number« (keine Zahl):
// NaN
trace(0/0);
Scheinbar gleiche Zahlen sind ungleich
Es kommt immer wieder vor, dass scheinbar gleiche Berechnungen zu ungleichen Zahlen führen. Dies liegt oft daran, dass bereits die Berechnungen eigentlich keine korrekte Zahl, sondern NaN liefern (NaN ist zwar vom Typ her eine Zahl, aber eigentlich beschreibt es ja eine Zahl, die keine ist). Und da zwei Zahlen, die eigentlich keine Zahlen sind, auch nicht zwangsläufig gleich sein müssen, ergibt der Vergleich in diesem Fall immer, dass die beiden Zahlen ungleich sind:
a = 0/0;
b = 0/0;
trace(a == b);// Ergibt false
Andere Berechnungen und Typumwandlungen führen ebenfalls zu »keiner Zahl«:
// Berechnung
trace(Infinity/Infinity);
trace(Math.acos(2));
// Typumwandlung
trace(Number("Hallo"));
Wert endlich
Ob ein Wert endlich ist, überprüfen Sie mit der Funktion isFinite. Ob es sich um keine Zahl handelt, ermittelt die Funktion isNaN.
Tabelle 7.3
Globale Variablen des Datentyps Zahl (engl. Number)
Bezeichner
|
Beschreibung
|
Infinity
|
Positive Unendlichkeit (entspricht Number.POSITIVE_INFINITY).
|
-Infinity
|
NegativeUnendlichkeit (entspricht Number.NEGATIVE_INFINITY).
|
NaN
|
Keine Zahl (engl. not a number).
|
Schreibweise
Zahlen dürfen grundsätzlich nicht nur als Dezimalzahlen aus den Ziffern 0 bis 9 bestehend angegeben werden. Auch die hexadezimale Schreibweise mit
16 Ziffern (0 bis 9 und a bis f) sowie die oktale Schreibweise mit acht Ziffern
(0 bis 7) sind erlaubt. Oktalzahlen beginnen immer mit einer führenden Null, Hexadezimalzahlen starten mit 0x (beachten Sie bitte, dass Hexadezimalzahlen in HTML-Dokumenten oft mit # beginnen):
// Dezimalzahlen
zahl = 123;
zahl = 123.4;
// Oktalzahlen
zahl = 01; // entspricht Dezimal 1
zahl = 011; // entspricht Dezimal 9
// Hexadezimalzahlen
zahl = 0xFF; // entspricht Dezimal 255;
zahl = 0xFF00FF; // beliebte Schreibweise für Farbwerte
Sollten Sie Zahlen zu anderen Basen als 8 (Oktal), 10 (Dezimal) oder 16 (Hexadezimal) benötigen, dann verwenden Sie die Funktion parseInt (siehe Seite 186).
Zehnerpotenzen
ActionScript stellt die Zehnerpotenzen von sehr kleinen bzw. sehr großen Zahlen (beispielsweise immer dann, wenn mehr als 15 Ziffern zur Darstellung vor dem Komma notwendig wären) mit einem e dar. Dieses e darf auch bei der Eingabe eingesetzt werden. Die Verwendung von 1e5 entspricht zum Beispiel der Zahl 100000, die auch als 1 * 105
mit einer Zehnerpotenz geschrieben werden kann.
Number-Objekt
Als Alternative zum primitiven Datentyp number bietet Flash auch ein Number-Objekt, das als komplexer Datentyp dient.
7.2.3 Zeichenketten (string)
Zeichenketten beinhalten eine Kette beliebiger Zeichen, die nicht an Berechnungen teilhaben sollen. Dabei basiert die interne Darstellung auf der Unicode-Variante UTF-16.
Ein Nachname ist eine Zeichenkette. Postleitzahlen und Telefonnummern sind ebenfalls Zeichenketten, da mit ihnen keine Berechnungen durchgeführt werden. Dabei ist es unerheblich, dass sie oft ausschließlich aus Zahlen bestehen.
Um eine Zeichenkette zu definieren, wird sie in Anführungszeichen gebettet:
variableDieEineZeichenketteBeinhaltet = "Zeichenkette";
Anstatt der doppelten Anführungszeichen sind bei den meisten Programmiersprachen wie auch in ActionScript Hochkommata erlaubt:
variableDieEineZeichenketteBeinhaltet = 'Zeichenkette';
Innerhalb einer Zeichenkette darf das jeweilige Anführungszeichen dann aber nicht direkt, sondern nur mit Hilfe einer durch den Rückwärtsschrägstrich \ eingeleiteten Escape-Sequenz verwendet werden. Der Rückwärtsschrägstrich wird wiederum durch \\ dargestellt:
// erlaubte Zeichenketten
zeichenkette = "text";
zeichenkette = 'text';
zeichenkette = "text anführungszeichen ' ";
zeichenkette = "text anführungszeichen " ';
zeichenkette = "text anführungszeichen \" ";
zeichenkette = 'text anführungszeichen \' ';
// nicht erlaubte Zeichenketten
zeichenkette = "text anführungszeichen " ";
zeichenkette = 'text anführungszeichen ' ';
Zeilenumbruch
Von größer Bedeutung für mehrzeilige Texte ist der Zeilenumbruch, der auf vielfältige Art und Weise beschrieben werden darf:
// Zeilenumbruch
trace("erste Zeile\rzweite Zeile");
// Zeilenumbruch (Oktal)
trace("erste Zeile\015zweite Zeile");
// Zeilenumbruch (Hexadezimal)
trace("erste Zeile\x0dzweite Zeile");
// Zeilenumbruch (UTF-16)
trace("erste Zeile\u000dzweite Zeile");
newline
Für den Zeilenumbruch bietet ActionScript darüber hinaus noch eine Konstante namens newline an:
// Zeilenumbruch mit einer Konstante
trace("erste Zeile"+newline+"zweite Zeile");
Die Auto-Format-Option des ActionScript-Editors verwandelt Oktal-, Hexadezimal- und Unicode-Angaben soweit möglich in die passenden Steuerzeichen, so dass bei ihrem Einsatz beispielsweise aus \u000d die Escape-Sequenz \r wird.
Zeilenumbruch
Je nach Flash-Version verwendet ActionScript intern \n (ASCII 10) oder \r (ASCII 13) für den Zeilenumbruch. Seit Flash MX wird normalerweise \r eingesetzt.
Tabelle 7.4
Escape-Sequenzen
Escape-Sequenz
|
Zeichen
|
\b
|
Rückschritt (Backspace, ASCII 8)
|
\f
|
Seitenvorschub (Form Feed, ASCII 12)
|
\n
|
Zeilenvorschub (Line Feed, ASCII 10)
|
\r
|
Wagenrücklauf (Carriage Return, ASCII 13)
|
\t
|
Tabulator (Tab, ASCII 9)
|
\"
|
Doppeltes Anführungszeichen
|
\’
|
Einfaches Anführungszeichen
|
\\
|
Rückwärtsschrägstrich
|
\000 bis \377
|
Ein oktaler Byte-Wert
|
\x00 bis \xFF
|
Ein hexadezimaler Byte-Wert
|
\u0000 bis \uFFFF
|
Ein 16-Bit-Unicode-Zeichen in Hexadezimalschreibweise
|
String-Objekt
Als Alternative zum primitiven Datentyp string bietet Flash auch ein String-Objekt, dass als komplexer Datentyp dient (siehe Seite 189). Die zahlreichen Methoden und Eigenschaften des String-Objektes stehen für den primitiven Datentyp ebenfalls zur Verfügung.
7.2.4 Null
Der Datentyp null mit dem einen Wert null wird immer dann eingesetzt, wenn explizit ausgedrückt werden soll, dass ein Wert bei Funktionsaufrufen fehlt bzw. eine Referenz nicht vorhanden ist.
Der Wert null unterscheidet sich von der Zahl 0 und einer leeren Zeichenkette, so dass ein Vergleich das Ergebnis falsch (engl. false) ergibt.
Die strikte Gleichheit (===) verhindert, dass null verglichen mit undefined das Ergebnis true ergibt, da in diesem Fall auch der unterschiedliche Typ berücksichtigt wird.
Tabelle 7.5
Vergleiche bei null und undefined
Vergleich
|
Ergebnis bei null und undefined
|
Beispiel mit null
|
Beispiel mit
undefined
|
Zahl 0
|
false
|
trace(null == 0);
|
trace(undefined
== 0);
|
leere Zeichenkette ""
|
false
|
trace(null == "");
|
trace(undefined
== "");
|
null
|
true
|
trace(null == null);
|
trace(null
== undefined);
|
undefined
|
true
|
trace(null ==
undefined);
|
trace(undefined
== undefined);
|
7.2.5 Undefiniert (undefined)
Der Datentyp undefined ist dem Typ null sehr ähnlich und besitzt ebenfalls mit undefined nur einen Wert. Werte sind immer dann undefiniert, wenn Sie noch nicht gesetzt wurden. D. h. wenn einer Variable noch kein Wert zugewiesen wurde.
Um den Inhalt einer Variablen zu löschen, ohne die Variable selbst zu entfernen, sollte null und nicht undefined zugewiesen werden.
Das Verhalten von undefined und null ist bei Vergleichen identisch (siehe Tabelle »Vergleiche bei null und undefined«). Nur bei der Typkonvertierung in eine Zeichenkette ergeben sich Unterschiede zueinander und zu ECMAScript.
Tabelle 7.6
Typkonvertierung bei null und undefined
Typ
|
String
|
Number
|
Boolean
|
null
|
"null"
|
0
|
false
|
undefined
|
Bis inkl. Flash 6 "", seit Flash 7 wie bei ECMAScript
"undefined"
|
Bis inkl. Flash 6 0, seit Flash 7 wie bei ECMAScript NaN
|
false
|
7.2.6 Komplexe Datentypen (Objekte)
Grundsätzlich handelt es sich bei allen nicht primitiven Datentypen in Flash um Objekte. Oder um noch genauer zu sein, um Vorkommen (engl. Instance) eines Prototyps. Zwar unterscheidet der typeof-Operator hier nur zwischen den Typen object, function und movieclip, doch es gibt eine große Anzahl weiterer Möglichkeiten, die sich hinter dem Datentyp object verbergen. Dazu zählen die Kernobjekte (engl. Coreobjects) aus ECMAScript und Flash-spezifische Erweiterungen. Außerdem steht es dem Entwickler frei, weitere Objekte zu entwerfen.
Tabelle 7.7
Kernobjekte in Flash und ECMAScript
Objekt
|
Bemerkung
|
das globale Objekt
|
seit Flash 6 (undokumentiert)
|
Object
|
seit Flash 5
|
Array
|
seit Flash 5
|
Boolean
|
seit Flash 5
|
Date
|
seit Flash 5
|
Error
|
seit Flash 7
|
Function
|
seit Flash 6
|
Math
|
seit Flash 4 (jedoch erst seit Flash 5 programmierbar)
|
Number
|
seit Flash 5
|
RegExp
|
nicht vorhanden
|
String
|
seit Flash 5
|
Tabelle 7.8
Anwendungsspezifische Objekte in Flash (integrierte Klassen)
Objekt
|
Bemerkung
|
Accessibility
|
seit Flash 6
|
Button
|
seit Flash 6 (grafisch bereits seit Flash 1)
|
Camera
|
seit Flash 6
|
Capabilities
|
seit Flash 6
|
Color
|
seit Flash 5
|
ContextMenu
|
seit Flash 7
|
Cookie
|
seit Flash 5 (undokumentiert)
|
CustomActions
|
seit Flash 6
|
Key
|
seit Flash 5
|
LoadVars
|
seit Flash 6
|
LocalConnection
|
seit Flash 6
|
Microphone
|
seit Flash 6
|
Mouse
|
seit Flash 5
|
MovieClip
|
seit Flash 3
|
MovieClipLoader
|
seit Flash 7
|
NetConnection
|
seit Flash 6
|
NetStream
|
seit Flash 6
|
PrintJob
|
seit Flash 7
|
Selection
|
seit Flash 5
|
SharedObject
|
seit Flash 6
|
Sound
|
seit Flash 5 (akustisch bereits seit Flash 1)
|
Stage
|
seit Flash 6
|
System
|
seit Flash 6
|
TextField
|
seit Flash 6
|
TextFormat
|
seit Flash 6
|
TextSnapshot
|
seit Flash 6 (jedoch erst seit Flash MX 2004 programmierbar)
|
Video
|
seit Flash 6
|
XML
|
seit Flash 5
|
XMLNode
|
seit Flash 5 (undokumentiert)
|
XMLSocket
|
seit Flash 5
|
|