類型轉換可以說是在值轉換成不同資料類型的值時發生。類型轉換可以是「隱含」或「明確」。隱含轉換,又稱為「強制」,有時候會在執行階段中執行。例如,如果將 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]"。
|