資料類型

「資料類型」會定義一組值。例如,Boolean 資料類型是只有 true false 兩個值的集合。除了 Boolean 資料類型以外,ActionScript 3.0 另外還定義了數個常用的資料類型,例如 String、Number 和 Array。您可以透過使用類別或介面定義自訂的值集合,自行定義資料類型。ActionScript 3.0 中所有的值都是物件,不管是基本值或複雜值都一樣。

「基本值」是屬於下列其中一個資料類型的值:Boolean、int、Number、String 和 uint。使用基本值通常會比使用複雜值快速,因為 ActionScript 是以特殊方式儲存基本值,而能夠讓記憶體和速度最佳化。

備註: 讀者若對技術層面的細節感興趣的話,應該會想知道 ActionScript 其實是將基本值以永遠不變的物件儲存於內部。儲存為永遠不變的物件,表示由參考傳遞與由值傳遞的效率都相同。因為參考通常比值本身小很多,所以這麼做便能降低記憶體的用量,同時也加快執行速度。

「複雜值」是非基本值的值。定義複雜值集的資料類型包括 Array、Date、Error、Function、RegExp、XML 和 XMLList。

許多程式語言會區分基本值及其包裝函式物件。例如,Java 有 int 基本值及包裝它的 java.lang.Integer 類別。Java 基本值並非物件,但其包裝函式是物件,使得基本值適用於某些作業,而包裝函式物件則較適合其它作業。在 ActionScript 3.0 中,由於考慮到實際應用目的,因此基本值及其包裝函式物件是不做區分的。所有值都是物件,甚至包括基本值也是。執行階段會將這些基本類型視為行為方式類似物件的特殊狀況,但並不需要一般建立物件所需的額外負荷。這表示下列兩行程式碼是相等的:

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

上面列出的所有基本和複雜資料類型都是以 ActionScript 3.0 核心類別定義的。核心類別可以讓您使用常值建立物件,而不是使用 new 運算子。例如,您可以使用常值或 Array 類別建構函式來建立陣列,如下所示:

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

類型檢查

類型檢查可能會在編譯階段或執行階段發生。靜態產生類型的語言 (如 C++ 和 Java) 會在編譯階段進行類型檢查;動態產生類型的語言 (如 Smalltalk 和 Python) 會在執行階段處理類型檢查。ActionScript 3.0 是動態產生類型的語言,具有執行階段類型檢查功能,但也能以特殊的編譯器模式 (稱為「嚴謹模式」) 支援編譯階段類型檢查功能。在嚴謹模式中,類型檢查會在編譯器階段及執行階段發生;但是在標準模式中,類型檢查只在執行階段中發生。

動態產生類型的語言能在建構程式碼時提供極大的彈性,但是卻必須允許類型錯誤在執行階段顯現。靜態產生類型的語言會在編譯階段報告類型錯誤,但是在編譯階段就必須要知道類型資訊。

編譯階段類型檢查

大型專案經常偏好使用編譯階段類型檢查,因為隨著專案的大小成長,資料類型彈性通常變得比較不重要,盡早發現類型錯誤反而顯得更重要。因此才會在預設時將 Flash Professional 和 Flash Builder 中的 ActionScript 編譯器設定為在嚴謹模式中執行。

Adobe Flash Builder

您可以在 Flash Builder 中,透過「Project Properties」對話方塊中的 ActionScript 編譯器設定來停用嚴謹模式。

為了提供編譯階段類型檢查,編譯器必須知道程式碼中變數或運算式的資料類型資訊。若要明確地宣告變數的資料類型,請加入冒號運算子 ( : ),之後再用資料類型做為變數名稱的字尾。若要使資料類型與參數產生關聯,請使用冒號運算子,之後再加上資料類型。例如,下列程式碼會將資料類型資訊加入 xParam 參數,而用明確的資料類型宣告變數 myParam

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

在嚴謹模式中,ActionScript 編譯器會將類型不相符回報為編譯器錯誤。例如,下列程式碼會宣告 Object 類型的函數參數 xParam ,但稍後會嘗試將 String 和 Number 類型的值指定給該參數。如此會在嚴謹模式中產生編譯器錯誤。

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

但是,即使在嚴謹模式中,您也可以選擇性地將指定陳述式的右邊保留為不具類型,決定不執行編譯階段類型檢查。您可以省略類型註釋,或使用特殊的星號 ( * ) 類型註釋,讓變數或運算式成為不具類型。例如,若上一個範例中的 xParam 參數已經過修改,使它不再有類型註釋,則程式碼將在嚴謹模式中進行編譯:

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

執行階段類型檢查

無論您在嚴謹模式或標準模式中進行編譯,ActionScript 3.0 中都會發生執行階段類型檢查。請考慮一種情況,在此情況下,3 這個值是傳遞做為預期有陣列的函數之引數。在嚴謹模式中,編譯器將產生錯誤,因為 3 這個值與資料類型 Array 不相容。若停用嚴謹模式,而且在標準模式中執行,則編譯器會回報類型不相符,而執行階段類型檢查則會導致執行階段錯誤。

下列範例會顯示名為 typeTest() 的函數,它預期會收到 Array 引數,但收到的卻是 3 這個值。如此便會在標準模式中導致執行階段錯誤,因為 3 這個值並不是該參數之宣告資料類型 (Array) 的成員。

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

在某些情況下,您可能也會收到執行階段錯誤,甚至在嚴謹模式中操作時也一樣。如果使用嚴謹模式,但使用不具類型的變數,決定不執行編譯階段類型檢查,就可能會發生這種情況。當您使用不具類型的變數時,並不會消除類型檢查,而是將檢查延遲到執行階段再進行。例如,假設上一個範例中的 myNum 變數並未宣告資料類型,編譯器無法偵測類型不相符的情形,但程式碼會產生執行階段錯誤,因為它會比較 myNum 的執行階段值 (由於指定陳述式的結果而設定為 3) 與 xParam 的類型 (設定為 Array 資料類型)。

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

相較於編譯階段檢查,執行階段類型檢查也允許以更具彈性的方式使用繼承。藉由將類型檢查延遲到執行階段,即使您「向上轉型」,標準模式也可以讓您參考子類別的屬性。使用基底類別宣告類別實體的類型,但是用子類別進行實體化時,就會發生向上轉型。例如,您可以建立可擴充的 ClassBase 類別 (具有 final 特質的類別無法進行擴充):

class ClassBase 
{ 
}

接著,您可以建立 ClassBase 的子類別 ClassExtender,它具有一個 someString 屬性,如下所示:

class ClassExtender extends ClassBase 
{ 
    var someString:String; 
}

您可以使用這兩個類別,建立使用 ClassBase 資料類型宣告的類別實體,但使用 ClassExtender 建構函式進行實體化。向上轉型被視為安全作業,因為基底類別只包含子類別中的屬性或方法。

var myClass:ClassBase = new ClassExtender();

但是子類別確實包含基底類別所不包含的屬性或方法。例如,ClassExtender 類別包含 someString 屬性,而 ClassBase 類別中並沒有此屬性。在 ActionScript 3.0 標準模式中,您可以使用 myClass 實體參考此屬性,而不會產生編譯階段錯誤,如下列範例所示:

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

is 運算子

is 運算子可以讓您測試變數或運算式是否為指定資料類型的成員。在舊版 ActionScript 中,是由 instanceof 運算子提供此功能,但在 ActionScript 3.0 中,則不應該使用 instanceof 運算子來測試資料類型的成員資格。進行手動類型檢查時,請勿使用 instanceof 運算子,而應該改用 is 運算子,因為運算式 x instanceof y 只會檢查 x 的原型鏈是否有 y 存在 (而在 ActionScript 3.0 中,原型鏈並不提供完整的繼承階層狀況)。

is 運算子會檢查正確的繼承階層,且不但可用來檢查物件是否為特定類別的實體,並可用來檢查物件是否為實作特定介面的類別實體。下列範例會建立名為 mySprite 的 Sprite 類別實體,並使用 is 運算子測試 mySprite 是否為 Sprite 和 DisplayObject 類別的實體,以及它是否會實作 IEventDispatcher 介面:

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

is 運算子會檢查繼承階層,並正確報告 mySprite 與 Sprite 和 DisplayObject 類別相容 (Sprite 類別是 DisplayObject 類別的子類別)。 is 運算子也會檢查 mySprite 是否繼承自任何實作 IEventDispatcher 介面的類別。由於 Sprite 類別是繼承自 EventDispatcher 類別,此類別會實作 IEventDispatcher 介面,所以 is 運算子會正確報告 mySprite 實作相同的介面。

下列範例會示範上個範例的相同測試,但是使用的是 instanceof 而不是 is 運算子。 instanceof 運算子會正確地識別 mySprite 為 Sprite 或 DisplayObject 的實體,但在用來測試 mySprite 是否實作 IEventDispatcher 介面時,則會傳回 false

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

as 運算子

as 運算子也可以讓您檢查運算式是否為指定資料類型的成員。與 is 運算子不同, as 運算子不會傳回 Boolean 值。 as 運算子是傳回運算式的值而非 true ;傳回 null 而非 false 。下列範例會示範不使用 is 而改用 as 運算子,在簡單的範例中檢查 Sprite 實體是否為 DisplayObject、IEventDispatcher 和 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

當您使用 as 運算子時,右邊的運算元必須是資料類型。若嘗試在右邊使用運算式而不用資料類型做為運算元,將會導致錯誤。

動態類別

「動態」類別會定義物件,此物件可以在執行階段,透過加入或變更屬性及方法進行改變。不是動態的類別 (例如 String 類別) 屬於「密封」類別。您不能在執行階段將屬性或方法加入至密封類別。

您可以在宣告類別時,使用 dynamic 特質,建立動態類別。例如,下列程式碼會建立名為 Protean 的動態類別:

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

若以後實體化 Protean 類別的實體,您可以在類別定義之外,將屬性或方法加入至此實體。例如,下列程式碼會建立 Protean 類別的實體,並將名為 aString aNumber 的屬性加入至此實體:

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

您加入至動態類別實體的屬性是執行階段實體,因此任何類型的檢查都是在執行階段進行。您不能將類型註釋加入至以此方式新增的屬性。

您也可以透過定義函數,然後將函數附加至 myProtean 實體的屬性,將方法加入至 myProtean 實體。下列程式碼會將 trace 陳述式移入名為 traceProtean() 的方法中:

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

但是,以這種方式建立的方法,無法存取 Protean 類別的任何私有屬性或方法。而且,即使參考 Protean 類別的公用屬性或方法,也必須利用 this 關鍵字或類別名稱加以限定。下列範例會示範 traceProtean() 方法嘗試存取 Protean 類別的私有和公用變數。

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

資料類型說明

基本資料類型包括:Boolean、int、Null、Number、String、uint 和 void。ActionScript 核心類別也會定義下列複雜資料類型:Object、Array、Date、Error、Function、RegExp、XML 和 XMLList。

Boolean 資料類型

Boolean 資料類型包含兩個值: true false 。Boolean 類型的變數沒有其它有效值。已宣告但未初始化的 Boolean 變數預設值為 false

int 資料類型

int 資料類型在內部是儲存為 32 位元的整數,而包含下列範圍的一組整數:

-2,147,483,648 (-2 31 ) 至 2,147,483,647 (2 31 - 1) (含)。舊版 ActionScript 僅提供 Number 資料類型,同時供整數與浮點數使用。而在 ActionScript 3.0 中,您可以存取低階電腦類型 32 位元具有正負號和無正負號的整數。如果變數不需要浮點數,不使用 Number 資料類型,而改用 int 資料類型應該會更快、更有效率。

對於在最小及最大 int 值範圍之外的整數值來說,使用 Number 資料類型可以處理介於正負 9,007,199,254,740,992 (53 位元整數值) 之間的值。int 資料類型變數的預設值為 0。

Null 資料類型

Null 資料類型僅包含 null 這個值。這是 String 資料類型及定義複雜資料類型之所有類別 (包括 Object 類別) 的預設值。其它任何基本資料類型,例如 Boolean、Number、int 和 uint,都不包含 null 這個值。在執行階段中,如果您嘗試將 null 指派給類型為 Boolean、Number、int 或 uint 的變數, null 這個值會轉換成適當的預設值。您無法使用此資料類型做為類型註釋。

Number 資料類型

在 ActionScript 3.0 中,Number 資料類型可以代表整數、無正負號的整數和浮點數值。但是若要得到最高效能,應該只在整數值大於 32 位元 int uint 類型所能儲存的數值時,或數值為浮點數時,才使用 Number 資料類型。若要儲存浮點數值,必須在數值中包含小數點。如果省略小數點,數值會儲存為整數。

Number 資料類型使用的是 IEEE 二進位浮點數運算標準 (IEEE-754) 所指定的 64 位元雙精度格式。這項標準規定使用 64 個可用位元儲存浮點數值的方式。其中,1 個位元是用來指定數值是正值或負值;11 個位元可供指數使用,儲存時以 2 為底;而其餘 52 個位元則是用來儲存「有效位數」(也稱為「尾數」),它是自乘至指數所指示的次方值。

Number 資料類型透過使用部分位元儲存指數,比使用其所有位元儲存有效位數可儲存的浮點數值大得多。例如,若 Number 資料類型將 64 個位元全部用來儲存有效位數,那麼可儲存的最大數目為 2 65 - 1。若使用 11 位元來儲存指數,則 Number 資料類型可將有效位數增加為 2 1023

Number 類型可代表的最大及最小值是儲存在 Number 類別的靜態屬性 Number.MAX_VALUE Number.MIN_VALUE 之中。

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

雖然這個數值的範圍非常之大,但是精確度相較之下則差了許多。Number 資料類型會使用 52 個位元儲存有效位數,其結果是需要 52 個位元以上才能精確地代表的數值 (例如,分數 1/3) 只是近似值而己。如果應用程式需要絕對精確度的小數,就必須使用實作小數浮點運算的軟體,而不能使用二進位浮點數運算。

以 Number 資料類型儲存整數值時,僅會用到有效位數的 52 個位元。Number 資料類型會使用這 52 個位元及特殊的隱藏位元代表自 -9,007,199,254,740,992 (-2 53 ) 至 9,007,199,254,740,992 (2 53 ) 的整數值。

NaN 值不只是做為 Number 類型變數的預設值而己,還可以做為任何應傳回但未傳回數值之運算作業的結果。例如,若嘗試計算負數的平方根,則結果會是 NaN 。其它特殊 Number 值包括「正無限大」和「負無限大」。

備註: 若除數也是 0 ,則除以 0 的結果只有 NaN 。當被除數是正數時,除以 0 會產生 infinity ;而當被除數是負數時,則產生 -infinity

String 資料類型

String 資料類型代表 16 位元字元的序列。字串會使用 UTF-16 格式,在內部儲存為 Unicode 字元。字串是永遠不變的值,與在 Java 程式語言中的性質相同。String 值的操作會傳回字串的新實體。使用 String 資料類型宣告的變數預設值為 null null 這個值和空字串 ( "" ) 不一樣。 null 這個值表示變數未儲存任何值,而空字串表示變數有一個值,也就是一個不包含任何字元的「字串」。

uint 資料類型

uint 資料類型在內部是儲存為 32 位元無正負號整數,而包含自 0 至 4,294,967,295 (2 32 - 1) 的一組整數 (包含 0 和 4,294,967,295)。在呼叫非負數整數的特殊狀況下,才會使用 uint 資料類型。例如,您必須使用 uint 資料類型代表像素顏色值,因為 int 資料類型所具有的內部正負號位元並不適合處理顏色值。對於比最大 uint 值還要大的整數值來說,使用 Number 資料類型可以處理 53 位元整數值。uint 資料類型變數的預設值為 0。

void 資料類型

void 資料類型只包含 undefined 這個值。在舊版 ActionScript 中, undefined 是 Object 類別之實體的預設值;在 ActionScript 3.0 中,Object 實體的預設值為 null 。若嘗試指定 undefined 的值給 Object 類別實體,該值會轉換為 null 。您只能將 undefined 值指定給不具類型的變數。不具類型變數是沒有任何類型註釋,或使用星號 ( * ) 類型註釋的變數。您只能使用 void 做為傳回類型註釋。

Object 資料類型

Object 資料類型由 Object 類別所定義。Object 類別可做為 ActionScript 中所有類別定義的基底類別。與舊版 ActionScript 相較之下,ActionScript 3.0 版 Object 資料類型的不同之處包含以下三方面:第一,Object 資料類型不再是指定給沒有類型註釋之變數的預設資料類型;第二,Object 資料類型不再包含 undefined 值,過去這是 Object 實體的預設值;第三,在 ActionScript 3.0 中,Object 類別之實體的預設值是 null

在舊版 ActionScript 中,沒有類型註釋的變數會自動指定為 Object 資料類型;而在 ActionScript 3.0 中已非如此,現在 ActionScript 3.0 包含真正不具類型變數的概念。沒有類型註釋的變數現在會視為不具類型。若要讓程式碼的讀者清清楚楚地知道,您是刻意要讓變數保持為不具類型,則可以使用類型註釋的星號 ( * ) 符號,這個符號等於省略類型註釋。下列範例會示範兩個相等的陳述式,兩個都會宣告不具類型的變數 x

var x 
var x:*

只有不具類型的變數可以存放 undefined 值。若嘗試將 undefined 值指定給具有資料類型的變數,執行階段會將 undefined 值轉換為該資料類型的預設值。例如 Object 資料類型 (預設值為 null ),表示如果您嘗試將 undefined 指派為 Object 實體,則值會轉換成 null

類型轉換

類型轉換可以說是在值轉換成不同資料類型的值時發生。類型轉換可以是「隱含」或「明確」。隱含轉換,又稱為「強制」,有時候會在執行階段中執行。例如,如果將 2 這個值指定給資料類型為 Boolean 的變數,就會先將 2 這個值轉換成 Boolean 值 true ,再將此值指定給變數。明確轉換也稱為「轉型」,是在您的程式碼指示編譯器將變數視為一種資料類型,而似乎是屬於不同的資料類型時發生。當涉及基本值時,轉型其實是從一種資料類型轉換成另一種資料類型。若要將物件轉換為另一種類型,您可以用括號括住物件名稱,並在它前面放置新類型的名稱。例如,下列程式碼會使用 Boolean 值進行轉型,將它轉換為整數:

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

隱含轉換

隱含轉換在執行階段時發生於幾種不同狀況下:

  • 在指定陳述式中

  • 當值做為函數引數傳遞時

  • 當值自函數傳回時

  • 在使用某些運算子 (如,加法 ( + ) 運算子) 的運算式中

    至於使用者定義的類型,在要轉換的值為目標類別之實體時,或衍生自目標類別的類別時,會順利進行隱含轉換。若隱含轉換不成功,就會發生錯誤。例如,下列程式碼包含成功的隱含轉換和不成功的隱含轉換:

    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.

    對於基本類型,隱含轉換是透過呼叫與明確轉換函數所呼叫相同的內部轉換演算法來處理。

明確轉換

在嚴謹模式中進行編譯時,使用明確轉換或轉型會很有幫助,因為有時您不希望因為類型不相符而產生編譯階段錯誤。當您知道強制轉換將在執行階段正確地轉換值時,可能就是這種情況。例如,使用自表單接收的資料時,可能要靠強制轉換將某些字串值轉換成數值。即使程式碼在標準模式中正確執行,下列程式碼也會產生編譯階段錯誤:

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

若要繼續使用嚴謹模式,但想要將字串轉換成整數,您可以使用明確轉換,如下所示:

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

轉型成 int、uint 和 Number

您可以將任何資料類型轉型成為下列三個數值類型之一:int、uint 和 Number。如果因為某些原則造成無法轉換數字,則會為 int 與 uint 資料類型指定預設值 0,以及為 Number 資料類型指定預設值 NaN 。如果將 Boolean 值轉換成數值, true 會成為 1 這個值;而 false 會成為 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

僅包含數字的字串值可以成功地轉換成為其中一種數值類型。數值類型也可以轉換成看起來像負數值的字串,或代表十六進位值的字串 (例如, 0x1A )。轉換程序會忽略字串值中的開頭或結尾空白字元。您也可以使用 Number() ,對看起來像浮點數值的字串進行轉型。如果包含小數點, uint() int() 會傳回整數,並將小數點和小數點之後的字元截斷。例如,下列字串值可以轉型成為數值:

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

包含非數值字元的字串值會在以 int() uint() 轉型時傳回 0;而在以 Number() 轉型時傳回 NaN 。轉換程序會忽略開頭或結尾空白字元,但如果字串有空白分隔兩個數值時,則會傳回 0 或 NaN

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

在 ActionScript 3.0 中, Number() 函數不再支援八進位或以 8 為基底的數字。若提供有開頭零的字串給 ActionScript 2.0 Number() 函數,則數字會截斷為八進位數字,並轉換成相等的十進位數。但是 Number() 函數在 ActionScript 3.0 中則不再是如此,而是會忽略開頭的零。例如,下列程式碼在使用不同版本的 ActionScript 編譯時,會產生不同的輸出:

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

將其中一個數值類型的值指定給不同數值類型的變數時,並不需要進行轉型作業。即使是在嚴謹模式中,數值類型也是以隱含方式轉換成其它數值類型。也就是說,在某些情況下,超過類型範圍時,可能會產生未預期的值。下列範例都會在嚴謹模式中編譯,但是有一些會產生未預期的值:

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

下表摘要列出從其它資料類型轉型成 Number、int 或 uint 資料類型的結果。

資料類型或值

轉換成 Number、int 或 uint 的結果

Boolean

若值為 true ,則為 1;否則為 0。

Date

Date 物件的內部形式,從全球時間 1970 年 1 月 1 日午夜開始計算的毫秒數。

null

0

物件

若實體為 null 並且轉換成 Number,則為 NaN ;否則為 0。

String

如果字串可以轉換成數字,則為一個數字;如果轉換成 Number,則為 NaN ,或者如果轉換成 int 或 uint,則為 0。

undefined

若轉換成 Number,則為 NaN ;若轉換成 int 或 uint,則為 0。

轉型成為 Boolean

從任何數值資料類型 (uint、int 和 Number) 轉型成為 Boolean,若數值為 0,則結果為 false ,否則為 true 。若是 Number 資料類型,則 NaN 這個值也會產生 false 的結果。下列範例會示範數字 -1、0 和 1 的轉型結果:

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

來自範例的輸出會示範三個數字的轉型結果,只有 0 會傳回 false 的值:

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

若字串是 null 或空字串 ( "" ),則從 String 值轉型成 Boolean 會傳回 false ;否則,它會傳回 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

從 Object 類別實體轉型成為 Boolean,若實體為 null ,則傳回 false ,否則傳回 true

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

Boolean 變數在嚴謹模式中會有特殊處理,您可以在其中指定任何資料類型的值給 Boolean 變數而無需轉型。即使在嚴謹模式中,也會從所有資料類型隱含強制轉換成 Boolean 資料類型。換句話說,與幾乎所有其它資料類型都不同的是,不必轉型成 Boolean 就可避免發生嚴謹模式錯誤。下列範例都會在嚴謹模式中編譯,而且在執行階段的行為方式將如預期:

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

下表摘要列出從其它資料類型轉型成 Boolean 資料類型的結果:

資料類型或值

轉換成 Boolean 的結果

String

若值為 null 或空字串 ( "" ),則為 false ;否則為 true

null

False

Number、int 或 uint

若值為 NaN 或 0,則為 false ;否則為 true

物件

若實體為 null ,則為 false ;否則為 true

轉型成 String

從任何數值資料類型轉型成 String 資料類型,都會傳回數值的字串形式。從 Boolean 值轉型成 String 資料類型,若值為 true 會傳回字串 "true" ;若值為 false ,則傳回字串 "false"

從 Object 類別的實體轉型成 String 資料類型,若實體為 null ,會傳回字串 "null" 。否則,從 Object 類別的實體轉型成 String 資料類型,會傳回字串 "[object Object]"

從 Array 類別的實體轉型成 String 時,會傳回包含所有陣列元素之逗號分隔清單的字串。例如,下列轉型成 String 資料類型會傳回一個包含陣列之全部三個元素的字串:

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

從 Date 類別的實體轉型成 String 資料類型,會傳回該實體包含的日期字串形式。例如,下列範例會傳回 Date 類別實體的字串形式 (輸出會顯示太平洋日光節約時區的結果):

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

下表摘要列出從其它資料類型轉型成 String 資料類型的結果。

資料類型或值

轉換成字串的結果

Array

由所有陣列元素組成的字串。

Boolean

" true " 或 " false "

Date

Date 物件的字串形式。

null

"null"

Number、int 或 uint

數字的字串形式。

物件

若實體為 null,則為 "null" ;否則為 "[object Object]"。