Datatyper

En datatyp definierar en serie värden. Datatypen Boolean är en serie av exakt två värden: true och false. Förutom datatypen Boolean definieras flera vanligare datatyper i ActionScript 3.0, däribland String, Number och Array. Du kan definiera egna datatyper genom att använda klasser eller gränssnitt för att definiera en egen uppsättning värden. Alla värden i ActionScript 3.0 är objekt, vare sig de är primitiva eller komplexa,.

Ett primitivt värde är ett värde som hör till någon av följande datatyper: Boolean, int, Number, String och uint. Det går oftast snabbare att arbeta med primitiva värden än att arbeta med komplexa värden, eftersom primitiva värden lagras i ActionScript på ett speciellt sätt som gör minnes- och hastighetsoptimering möjlig.

Obs! I ActionScript lagras primitiva värden internt som oföränderliga objekt, vilket kan vara intressant att veta. Det faktum att de lagras som oföränderliga objekt betyder att överföring med referens är detsamma som överföring med värde. Detta minskar minnesanvändningen och ökar körningshastigheten eftersom referenserna vanligtvis är mycket mindre än själva värdena.

Ett komplext värde är ett värde som inte är primitivt. Datatyper som definierar uppsättningar av komplexa värden är bland annat Array, Date, Error, Function, RegExp, XML och XMLList.

I många programmeringsspråk skiljer man mellan primitiva värden och deras wrapper-objekt. Java har till exempel det primitiva värdet int och klassen java.lang.Integer som omsluter värdet. Primitiva värden i Java är inte objekt, men deras wrapprar är det, vilket gör att primitiva värden är bra för vissa åtgärder och wrapper-objekt är bättre för andra åtgärder. I ActionScript 3.0 är primitiva värden och deras wrapper-objekt omöjliga att särskilja. Alla värden, även primitiva, är objekt. I körningsmiljön behandlas dessa primitiva typer som specialfall som beter sig som objekt, men som inte kräver den kapacitet som normalt associeras med att skapa objekt. Det betyder att följande två kodrader är likvärdiga:

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

Alla ovanstående primitiva och komplexa datatyper definieras av huvudklasserna i ActionScript 3.0. Med huvudklasserna kan du skapa objekt med hjälp av literala värden i stället för att använda operatorn new. Du kan till exempel skapa en array med ett literalt värde eller klasskonstruktorn Array så här:

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

Typkontroll

Typkontroll utförs antingen vid kompilering eller vid körning. Språk med statiska typer, som C++ och Java, utför typkontroll vid kompileringen. Språk med dynamiska typer, som Smalltalk och Python, hanterar typkontroll vid körningen. ActionScript 3.0, som är ett språk med dynamiska typer, har en typkontroll som utförs vid körningen, men kan även använda en typkontroll som utförs vid kompileringen tack vare ett speciellt kompileringsläge som kallas strikt läge. I strikt läge utförs typkontrollen både vid kompilering och vid körning, men i standardläge utförs typkontroll bara vid körning.

Språk som har dynamiska typer är otroligt flexibla när du strukturerar kod men genererar typfel vid körningen. Språk med statiska typer rapporterar typfel vid kompileringen och typinformation krävs vid kompileringen.

Typkontroll vid kompilering

Typkontroll vid kompilering föredras ofta i större projekt. Detta beror på, att när man arbetar med stora projekt blir det viktigare att hitta typfel så tidigt som möjligt än att man använder en flexibel datatyp. Det är därför som ActionScript-kompilatorn i Flash Professional och Flash Builder som standard är inställd på att köras i strikt läge.

Adobe Flash Builder

Du kan inaktivera det strikta läget i Flash Builder via inställningarna för ActionScript-kompilatorn i dialogrutan Project Properties.

För att kompilatorn ska kunna utföra typkontroll vid kompilering måste koden innehålla datatypsinformation om variabler och uttryck. Om du vill deklarera en datatyp för en variabel lägger du till kolonoperatorn (:) följt av datatypen som suffix i variabelnamnet. Om du vill associera en datatyp med en parameter använder du kolonoperatorn följt av datatypen. I följande kod läggs datatypsinformation till i parametern xParam och deklareras variabeln myParam med en explicit datatyp:

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

I strikt läge rapporterar ActionScript-kompilatorn felaktig matchning av typer som kompileringsfel. I följande kod deklareras funktionsparametern xParam, för typen Object, men försök görs senare att tilldela värden av typen String och Number till den parametern. Detta skapar ett kompileringsfel i strikt läge.

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); 
    } 
}

Du kan emellertid även i strikt läge selektivt välja bort typkontroll vid kompilering genom att låta höger sida av en tilldelningsprogramsats vara typlös. Du kan markera en variabel eller ett uttryck som typlöst genom att antingen utesluta en typanteckning eller använda den speciella asterisktypanteckningen (*). Om parametern xParam i föregående exempel ändras så att den inte längre har en typanteckning kompileras koden i strikt läge:

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");

Typkontroll vid körning

Typkontroll vid körning utförs i ActionScript 3.0 vare sig du kompilerar i strikt läge eller i standardläge. Anta att värdet 3 skickas som ett argument till en funktion som förväntar sig en array. I strikt läge genereras ett fel eftersom värdet 3 inte är kompatibelt med datatypen Array. Om du inaktiverar strikt läge och kör i standardläge reagerar kompilatorn inte över typmatchningsfelet, men typkontrollen vid körning resulterar i ett körningsfel.

I följande exempel visas funktionen typeTest() som förväntar sig ett Array-argument men som tar emot värdet 3. Detta förorsakar ett körningsfel i standardläge eftersom värdet 3 inte ingår i parameterns deklarerade datatyp (Array).

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

Du kan också i vissa situationer få ett körningsfel även när du arbetar i strikt läge. Detta kan hända om du använder strikt läge men väljer bort typkontroll vid kompilering genom att använda en typlös variabel. När du använder en typlös variabel väljer du inte bort typkontrollen, utan fördröjer den till körningen. Om till exempel variabeln myNum i föregående exempel inte har en deklarerad datatyp kan kompilatorn inte identifiera typmatchningsfelet. Koden genererar då ett körningsfel, eftersom körningsvärdet för myNum, som har värdet 3 som ett resultat av tilldelningsprogramsatsen, jämförs med typen för xParam, som är inställd på datatypen Array.

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

Typkontroll vid körning tillåter flexiblare användning av arv än typkontroll vid kompilering. Genom att fördröja typkontrollen till körningen kan du i standardläge referera egenskaper av en underklass även om du använder upcast. En upcast inträffar när du använder en basklass för att deklarera typ av klassinstans men en underklass för att instansiera den. Du kan alltså skapa en klass med namnet ClassBase som kan utökas (klasser med attributet final kan inte utökas):

class ClassBase 
{ 
}

Du kan därefter skapa en underklass för ClassBase som heter ClassExtender som har en egenskap som heter someString enligt följande:

class ClassExtender extends ClassBase 
{ 
    var someString:String; 
}

Om du använder båda klasserna kan du skapa en klassinstans som deklareras med datatypen ClassBase men som instansieras med konstruktorn ClassExtender. En upcast är en säker åtgärd eftersom basklassen bara innehåller egenskaper och metoder som finns i underklassen.

var myClass:ClassBase = new ClassExtender();

En underklass innehåller däremot egenskaper och metoder som basklassen inte innehåller. Klassen ClassExtender innehåller till exempel egenskapen someString som inte finns i klassen ClassBase. I standardläge i ActionScript 3.0 kan du referera den här egenskapen med instansen myClass utan att generera ett kompileringsfel, vilket visas i följande exempel:

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

Operatorn is

Med operatorn is kan du testa om en variabel eller ett uttryck är medlem i en viss datatyp. I tidigare versioner av ActionScript hade operatorn instanceof den här funktionaliteten, men i ActionScript 3.0 ska operatorn instanceof inte användas för att testa datatypsmedlemskap. Använd operatorn is i stället för operatorn instanceof för manuell typkontroll eftersom uttrycket x instanceof y snarare kontrollerar om prototypkedjan för x innehåller y (och i ActionScript 3.0 ger prototypkedjan inte en fullständig bild av arvshierarkin).

Operatorn is kontrollerar arvshierarkin och kan användas för att kontrollera inte bara om ett objekt är en instans av en viss klass, utan även om objektet är en instans av en klass som implementerar ett visst gränssnitt. I följande exempel skapas en instans av klassen Sprite som heter mySprite och använder operatorn is för att testa om mySprite är en instans av klasserna Sprite och DisplayObject, och huruvida den implementerar gränssnittet IEventDispatcher:

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

Operatorn is kontrollerar arvshierarkin och rapporterar att mySprite är kompatibel med klasserna Sprite och DisplayObject (klassen Sprite är en underklass till klassen DisplayObject). Operatorn is kontrollerar också om mySprite ärver från några klasser som implementerar gränssnittet IEventDispatcher. Eftersom klassen Sprite ärver från klassen EventDispatcher, som implementerar gränssnittet IEventDispatcher, rapporterar operatorn is att mySprite implementerar samma gränssnitt.

I följande exempel visas samma tester från föregående exempel, men med instanceof i stället för operatorn is. Operatorn instanceof identifierar att mySprite är en instans av Sprite eller DisplayObject, men den returnerar false när den används för att testa om mySprite implementerar gränssnittet IEventDispatcher.

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

Operatorn as

Med operatorn as kan du testa om ett uttryck är medlem i en viss datatyp. l motsats till operatorn is returnerar operatorn as inte ett booleskt värde. I stället returnerar operatorn as värdet för uttrycket i stället för true, och null i stället för false. I följande exempel visas resultatet av att använda operatorn as i stället för operatorn is vid en enkel kontroll av om instansen Sprite är medlem i datatypen DisplayObject, IEventDispatcher och Number.

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

När du använder operatorn as måste operanden till höger vara en datatyp. Om du försöker använda ett uttryck som inte är en datatyp som operand till höger genereras ett fel.

Dynamiska klasser

Med en dynamisk klass definieras ett objekt som du kan ändra vid körning genom att lägga till eller ändra egenskaper och metoder. En klass som inte är dynamisk, till exempel klassen String, är en fast klass. Du kan inte lägga till egenskaper och metoder i en fast klass vid körning.

Du kan skapa dynamiska klasser med attributet dynamic när du deklarerar en klass. Med följande kod skapas en dynamisk klass som heter Protean:

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

Om du senare instansierar en instans av klassen Protean kan du lägga till egenskaper och metoder i den utanför klassdefinitionen. Med följande kod skapas till exempel en instans av klassen Protean och läggs egenskapen aString och egenskapen aNumber till i instansen.

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

Egenskaper som du lägger till i en instans av en dynamisk klass är körningsenheter, och all typkontroll utförs vid körning. Du kan inte lägga till en typanteckning i en egenskap som du lägger till på det här sättet.

Du kan också lägga till en metod i instansen myProtean genom att definiera en funktion och bifoga den till en egenskap för instansen myProtean. Följande kod flyttar programsatsen trace till metoden traceProtean():

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

Metoder som skapats på det här sättet kommer inte åt privata egenskaper eller metoder av klassen Protean. Referenser till allmänna egenskaper eller metoder för klassen Protean måste dessutom kvalificeras med antingen nyckelordet this eller med klassnamnet. I följande exempel visas hur metoden traceProtean() försöker komma åt privata och allmänna variabler för klassen Protean.

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

Beskrivning av datatyper

Primitiva datatyper kan vara Boolean, int, Null, Number, String, uint och void. Huvudklasserna i ActionScript definierar också följande komplexa datatyper: Object, Array, Date, Error, Function, RegExp, XML och XMLList.

Boolean, datatyp

Datatypen Boolean kan ha två värden: true och false. Inga andra värden är giltiga för den här datatypen. Standard för en boolesk variabel som är deklarerad, men inte initierad, är false.

int, datatyp

Datatypen int lagras internt som 32-bitars heltal och har en uppsättning heltal från

-2 147 483 648 (-231) till och med 2 147 483 647 (231 - 1). Tidigare versioner av ActionScript hade bara datatypen Number som användes för både heltal och flyttal. I ActionScript 3.0 kan du använda lågnivåmaskintyper för 32-bitars heltal med och utan tecken. Om din variabel inte använder flyttal går det snabbare och är effektivare om du använder datatypen int i stället för datatypen Number.

För heltalsvärden som ligger utanför minimi- och maximivärdena för int använder du datatypen Number, som kan hantera värden mellan positiva och negativa 9 007 199 254 740 992 (53-bitars heltalsvärden). Standardvärdet för variabler som är av datatypen int är 0.

Null, datatyp

Datatypen Null innehåller bara ett värde, null. Detta är standardvärdet för datatypen String och alla klasser som definierar komplexa datatyper, däribland klassen Object. Ingen av de primitiva datatyperna, till exempel Boolean, Number, int eller uint, innehåller värdet null. Vid körning konverteras värdet null till lämpligt standardvärde om du försöker tilldela null till variabler av typen Boolean, Number, int eller uint. Du kan inte använda den här datatypen som en typanteckning.

Number, datatyp

I ActionScript 3.0 kan den här datatypen representera heltal, heltal utan tecken och flyttal. Om du vill maximera prestanda bör du använda datatypen Number bara för heltal som är större än vad 32-bitarstyperna int och uint kan lagra eller för flyttal. Om du vill lagra flyttal måste du infoga ett decimalkomma i talet. Om du utesluter decimalkommat sparas talet som ett heltal.

Datatypen Number använder 64-bitars dubbelprecisionsformat som anges av IEEE:s standard för binär flyttalsaritmetik (IEEE-754). Denna standard anger hur flyttal lagras med 64 tillgängliga bitar. En bit används för att ange om talet är positivt eller negativt. Elva bitar används för exponenten som lagras som bas 2. De återstående 52 bitarna används för att lagra signifikanden (kallas också mantissa), som är det tal som upphöjs till det som anges av exponenten.

Genom att använda vissa bitar för att lagra en exponent kan datatypen Number lagra flyttal som är mycket större än om den använde alla bitarna för signifikanden. Om datatypen Number till exempel använder alla 64 bitar för att lagra signifikanden, bör den lagra ett tal som är så stort som 265 - 1. Genom att använda elva bitar för att lagra en exponent kan datatypen Number upphöja signifikanden till 21023.

Maximi- och minimivärdena som typen Number kan representera lagras i statiska egenskaper för klassen Number som kallas Number.MAX_VALUE respektive Number.MIN_VALUE.

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

Även om det här talintervallet är enormt är priset för intervallet precision. Datatypen Number använder 52 bitar för att lagra signifikanden, vilket resulterar i att tal som kräver mer än 52 bitar för att representeras exakt, till exempel bråket 1/3, bara blir approximationer. Om ditt program kräver absolut precision med decimaltal måste du använda program som implementerar decimalflyttalsaritmetik i motsats till binär flyttalsaritmetik.

När du lagrar heltalsvärden med datatypen Number används bara de 52 bitarna av signifikanden. Datatypen Number använder dessa 52 bitar och en speciell dold bit för att representera heltal från -9 007 199 254 740 992 (-253) till 9 007 199 254 740 992 (253).

Värdet NaN används inte bara som standardvärde för variabler av typen Number, utan också som resultatet av en beräkning som ska returnera ett tal men som inte gör det. Om du till exempel försöker beräkna kvadratroten av ett negativt tal blir resultatet NaN. Andra speciella Number-värden är positiv oändlighet och negativ oändlighet.

Obs! Resultatet av division med 0 är bara NaN om divisorn också är 0. Division med 0 skapar infinity när dividenden är positiv eller -infinity när dividenden är negativ.

String, datatyp

Datatypen String representerar en sekvens av 16-bitarstecken. Strängar sparas internt som Unicode-tecken med UTF-16-formatet. Strängar är oföränderliga värden, på samma sätt som i programmeringsspråket Java. En operation på ett String-värde resulterar i en ny instans av strängen. Standardvärdet för en variabel som har deklarerats med datatypen String är null. Värdet null är inte samma sak som den tomma strängen (""). Värdet null betyder att variabeln saknar ett sparat värde, medans en tom sträng betyder att variabeln har ett värde som är en sträng utan några tecken.

uint, datatyp

Datatypen uint lagras internt som ett 32-bitars heltal utan tecken och innehåller en serie heltal från 0 till och med 4 294 967 295 (232 - 1). Använd datatypen uint vid speciella tillfällen som anropar icke-negativa heltal. Du måste till exempel använda datatypen uint för att representera pixelvärden i färg eftersom datatypen int har en intern bit med tecken som inte är lämplig för hantering av färgvärden. Om det gäller heltal som är större än maximivärdet för uint använder du datatypen Number som kan hantera 53-bitars heltal. Standardvärdet för variabler som är av datatypen uint är 0.

void, datatyp

Datatypen void innehåller bara ett värde, undefined. I tidigare versioner av ActionScript var undefined standardvärde för instanser av klassen Object. I ActionScript 3.0 är standardvärdet för Object-instanser null. Om du försöker tilldela en instans av klassen Object värdet undefined konverteras värdet till null. Du kan bara tilldela variabler som är typlösa värdet undefined. Typlösa variabler är variabler som antingen saknar typanteckning eller som använder symbolen asterisk (*) för typanteckning. Du kan använda void bara som returtypsanteckning.

Object, datatyp

Datatypen Object definieras av klassen Object. Klassen Object fungerar som basklass för alla klassdefinitioner i ActionScript. ActionScript 3.0-versionen av datatypen Object skiljer sig på tre sätt från datatypen i tidigare versioner. För det första är datatypen Object inte längre standarddatatyp som tilldelas variabler utan typanteckning. För det andra innehåller datatypen Object inte längre värdet undefined, som används som standardvärde för Object-instanser. För det tredje är standardvärdet för klassen Object null i ActionScript 3.0.

I tidigare versioner av ActionScript har en variabel utan typanteckning automatiskt tilldelats datatypen Object. Detta gäller inte längre i ActionScript 3.0 som nu innehåller en helt typlös variabel. Variabler utan typanteckning betraktas nu som typlösa. Om du vill visa läsarna av din kod att du avsiktligen har lämnat en variabel typlös kan du använda en asterisk (*) för typanteckningen, vilket motsvarar att utesluta en typanteckning. I följande exempel visas två likvärdiga programsatser som båda deklarerar den typlösa variabeln x:

var x 
var x:*

Endast typlösa variabler kan innehålla värdet undefined. Om du försöker tilldela en variabel som har en datatyp värdet undefined konverteras värdet undefined till standardvärdet för den datatypen vid körning. För instanser av datatypen Object är standardvärdet null, vilket betyder att om du försöker tilldela värdet undefined till en Object-instans konverteras värdet till null.

Typkonverteringar

En typkonvertering inträffar när ett värde transformeras till ett värde av en annan datatyp. Typkonverteringar kan antingen vara implicita eller explicita. Implicit konvertering, som även kallas tvång, utförs ibland vid körning. Om till exempel värdet 2 tilldelas en variabel med datatypen Boolean konverteras värdet 2 till det booleska värdet true innan variabeln tilldelas värdet. Explicit konvertering, som också kallas datatypsbyte, inträffar när koden instruerar kompilatorn att hantera en variabel av en viss datatyp som om den hör till en annan datatyp. När primitiva värden ingår konverteras värden från en datatyp till en annan datatyp med datatypsbytet. När du vill byta datatyp för ett objekt omsluter du objektnamnet med parentes och skriver namnet på den nya datatypen framför. I följande kod byts en boolesk variabel ut mot en heltalsvariabel:

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

Implicita konverteringar

Implicita konverteringar inträffar vid körning i olika sammanhang:

  • I tilldelningsprogramsatser

  • När värden skickas som funktionsargument

  • När värden returneras från funktioner

  • I uttryck som använder vissa operatorer, till exempel additionsoperatorn (+)

    För användardefinierade typer lyckas implicita konverteringar när värdet som ska konverteras är en instans av destinationsklassen eller en klass som härstammar från destinationsklassen. Om en implicit konvertering misslyckas uppstår ett fel. Följande kod innehåller en lyckad och en misslyckad implicit konvertering:

    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.

    Om det gäller primitiva typer hanteras implicita konverteringar genom anrop till samma interna konverteringsalgoritmer som anropas av de explicita konverteringsfunktionerna.

Explicita konverteringar

Du bör använda explicita konverteringar, eller datatypsbyte, när du kompilerar i strikt läge eftersom du kanske inte vill att ett typmatchningsfel ska generera ett kompileringsfel. Detta kan inträffa när du vet att tvång kommer att konvertera dina värden korrekt vid körning. När du till exempel arbetar med data som du fått från ett formulär, kanske du vill förlita dig på tvång för att konvertera vissa strängvärden till numeriska värden. I följande kod genereras ett kompileringsfel även om koden kan köras korrekt i standardläge:

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

Om du vill fortsätta i strikt läge, men vill att strängen ska konverteras till ett heltal, kan du använda explicit konvertering enligt följande:

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

Datatypsbyte till int, uint och Number

Du kan byta ut en datatyp till någon av de tre taltyperna int, uint och Number. Om det av någon anledning inte går att konvertera talet tilldelas datatyperna int och uint standardvärdet 0, medan datatypen Number tilldelas standardvärdet NaN. Om du konverterar ett booleskt värde till ett tal blir true värdet 1 och false blir värdet 0.

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

Strängvärden som innehåller bara siffror kan konverteras till någon av taltyperna. Taltyperna kan också konvertera strängar som ser ut som negativa tal eller strängar som representerar ett hexadecimalt värde (till exempel 0x1A). Vid konverteringen ignoreras inledande och avslutande tomrum i strängvärdet. Du kan också byta strängar som ser ut som flyttal med Number(). Inkluderingen av ett decimaltecken gör att uint() och int() returnerar ett heltal och decimaltecknet och de tecken som kommer efter trunkeras. Följande strängvärden kan till exempel bytas till tal:

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

Strängvärden som innehåller icke-numeriska tecken returnerar 0 när de byts med int() eller uint() och NaN när de byts med Number(). Vid konverteringen ignoreras inledande och avslutande tomrum, men 0 eller NaN returneras om en sträng har ett tomrum som avgränsar två tal.

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

I ActionScript 3.0 stöder funktionen Number() inte längre oktala (eller bas-8) tal. Om du använder en sträng med en inledande nolla i funktionen Number() i ActionScript 2.0 tolkas talet som ett oktalt tal och konverteras till ett decimaltal. Detta gäller inte med funktionen Number() i ActionScript 3.0 där nollan ignoreras. Med följande kod genereras olika utdata vid kompilering med olika versioner av ActionScript:

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

Datatypsbyte är nödvändigt när ett värde av en viss numerisk typ tilldelas en variabel av en annan numerisk typ. Även i strikt läge konverteras de numeriska typerna implicit till andra numeriska typer. Detta betyder att man i vissa fall får oväntat resultat när intervallet för en typ överskrids. Följande exempel kompileras alla i strikt läge, men vissa av dem genererar oväntade värden:

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

I följande tabell sammanfattas resultatet av datatypsbyte till Number, int eller uint från andra datatyper.

Datatyp eller värde

Resultat av konvertering till Number, int eller uint

Boolean

Om värdet är true: 1, annars 0.

Date

Den interna beteckningen för objektet Date, som är antalet millisekunder som förflutit sedan midnatt den 1 januari 1970, universaltid.

null

0

Object

Om instansen är null och konverterat till Number NaN; annars 0.

String

Ett tal om det går att konvertera strängen till ett tal; i annat fall NaN om det konverteras till Number eller 0 om det konverteras till int eller uint.

undefined

NaN om den konverteras till Number. 0 om den konverteras till int eller uint.

Datatypsbyte till Boolean

Datatypsbyte till Boolean från någon av de numeriska datatyperna (uint, int eller Number) resulterar i false om det numeriska värdet är 0, och i annat fall i true. Om du använder datatypen Number kan värdet NaN också resultera i false. I följande exempel visas resultatet av datatypsbyte av talen -1, 0 och 1:

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

Utdata från exemplet visar att värdet false bara returneras av talet 0:

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

Databyte till Boolean från ett strängvärde returnerar false om strängen är null eller en tom sträng (""). I annat fall returneras true.

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

Databyte till Boolean från en instans av klassen Object returnerar false om instansen är null och returnerar annars true:

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

Booleska variabler får specialbehandling i strikt läge på det sättet att du kan tilldela ett booleskt värde värden av valfri datatyp utan att använda databyte. Implicit tvång från alla datatyper till datatypen Boolean inträffar även i strikt läge. Databyte till Boolean är inte nödvändigt för att undvika fel i strikt läge i motsats till byte till andra datatyper. I följande exempel kompileras allt i strikt läge och beteendet blir väntat vid körning:

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

I följande tabell sammanfattas resultatet av datatypsbyte till Boolean från andra datatyper:

Datatyp eller värde

Resultat av konvertering till Boolean

String

false om värdet är null eller tom sträng (""). Annars true.

null

false

Number, int eller uint

false om värdet är NaN eller 0; annars true.

Object

false om instansen är null; annars true.

Databyte till String

Vid databyte till datatypen String från någon av de numeriska datatyperna returneras en strängbeteckning för talet. Vid databyte till datatypen String från ett booleskt värde returneras strängen "true"om värdet är true och strängen "false" om värdet är false.

Vid databyte till datatypen String från en instans av klassen Objekt returneras strängen"null" om instansen är null. I annat fall vid databyte till typen Sträng från klassen Object returneras strängen "[object Object]".

Vid databyte till String från en instans av klassen Array returneras en sträng som innehåller en semikolonavgränsad lista på alla array-element. I följande databyte till datatypen String returneras en sträng som innehåller alla tre elementen av arrayen:

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

Vid databyte till String från en instans av klassen Date returneras en strängbeteckning för det datum som instansen innehåller. I följande exempel returneras en strängbeteckning för klassinstansen Date (utdata ger resultatet för Pacific Daylight Time):

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

I följande tabell sammanfattas resultatet av datatypsbyte till datatypen String från andra datatyper.

Datatyp eller värde

Resultat av konvertering till String

Array

En sträng som består av alla array-element.

Boolean

"true eller false"

Date

En strängbeteckning för objektet Date.

null

"null"

Number, int eller uint

En strängbeteckning för talet.

Object

Om instansen är null "null". Annars "[object Object]".