類型轉換

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

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

副主題

隱含轉換
明確轉換
轉型成 int、uint 和 Number
轉型成為 Boolean
轉型成 String

隱含轉換

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

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

class A {}
class B extends A {}

var objA:A = new A();
var objB:B = new B();
var arr:Array = new Array();

objA = objB; // 轉換成功。
objB = arr; // 轉換失敗。

對於基本類型,隱含轉換是透過呼叫與明確轉換函數所呼叫相同的內部轉換演算法來處理。下列各節將詳細探討這些基本類型轉換。

明確轉換

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

var quantityField:String = "3";
var quantity:int = quantityField; // 嚴謹模式中的編譯階段錯誤

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

var quantityField:String = "3";
var quantity:int = int(quantityField); // 明確轉換成功。

轉型成 int、uint 和 Number

您可以將任何資料類型轉型成為下列三個數值類型之一:int、uint 和 Number。如果 Flash Player 由於不明原因無法轉換數值,便會為 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,透過 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; // 為 uint 變數指定 int/Number 值
trace(myUInt); // 4294967293

var myNum:Number = sampleUINT; // 為 Number 變數指定 int/uint 值
trace(myNum) // 4294967293

var myInt:int = uint.MAX_VALUE + 1; // 為 uint 變數指定 Number 值
trace(myInt); // 0

myInt = int.MAX_VALUE + 1; // 為 int 變數指定 uint/Number 值
trace(myInt); // -2147483648

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

資料類型或值

轉換成 Number、int 或 uint 的結果。

Boolean

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

Date

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

null

0

Object

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

String

若 Flash Player 可以將字串轉換成數字,則為數字;否則,若轉換成 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;       // 未初始化的字串為 null。
trace(Boolean(str1));  // false

var str2:String = "";  // 空字串
trace(Boolean(str2));  // false

var str3:String = " "; // 僅空白字元
trace(Boolean(str3));  // true

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

var myObj:Object;      // 未初始化的物件為 null。
trace(Boolean(myObj)); // false

myObj = new Object();  // 實體化
trace(Boolean(myObj)); // true

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

var myObj:Object = new Object();  // 實體化
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

Object

若實體為 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

數字的字串形式。

Object

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


Flash CS3

 

有新的意見加入至這個頁面時,傳送電子郵件給我 | 意見報告

目前頁面: http://livedocs.adobe.com/flash/9.0_tw/main/00000048.html