flash as3 類型轉換

類型轉換

在將某個值轉換爲其它數據類型的值時,就說發生了類型轉換。類型轉換可以是"隱式的",也可以是"顯式的"。隱式轉換又稱爲"強制",有時由 Flash Player 在運行時執行。例如,如果將值 2 賦給 Boolean 數據類型的變量,則 Flash Player 會先將值 2 轉換爲布爾值 true,然後再將其賦給該變量。顯式轉換又稱爲"轉換",在代碼指示編譯器將一個數據類型的變量視爲屬於另一個數據類型時發生。在涉及基元值時,轉換功能將一個數據類型的值實際轉換爲另一個數據類型的值。要將對象轉換爲另一類型,請用小括號括起對象名並在它前面加上新類型的名稱。例如,下面的代碼提取一個布爾值並將它轉換爲一個整數:

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。如果將布爾值轉換爲數字,則 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.0Number() 函數提供的字符串中包含前導 0,則該數字將被視爲八進制數,並將轉換爲等效的十進制數。對於 ActionScript 3.0 中的 Number() 函數,情況並非如此,因爲 ActionScript 3.0 會忽略前導 0。例如,在使用不同的 ActionScript 版本進行編譯時,下面的代碼會生成不同的輸出結果:

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

將一種數值類型的值賦給另一種數值類型的變量時,轉換並不是必需的。即使在嚴格模式下,數值類型也會隱式轉換爲其它數值類型。這意味着,在某些情況下,在超出類型的範圍時,可能會生成意外的值。下面的幾個示例全部是在嚴格模式下進行編譯的,但是某些示例將生成意外的值:

var myUInt:uint = -3; // 將 int/Number 值賦給 uint 變量 
trace(myUInt); // 4294967293 
var myNum:Number = sampleUINT; // 將 int/uint 值賦給 Number 變量 
trace(myNum) // 4294967293 
var myInt:int = uint.MAX_VALUE + 1; // 將 Number 值賦給 uint 變量 
trace(myInt); // 0 
myInt = int.MAX_VALUE + 1; // 將 uint/Number 值賦給 int 變量 
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

在將字符串值轉換爲 Boolean 數據類型時,如果字符串爲 null 或空字符串 (""),則會返回 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 數據類型不是避免在嚴格模式下出錯所必需的。下面的幾個示例全部是在嚴格模式下編譯的,它們在運行時按照預期的方式工作:

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 數據類型時,都會返回數字的字符串表示形式。在將布爾值轉換爲 String 數據類型時,如果值爲 true,則返回字符串 "true";如果值爲 false,則返回字符串 "false"

在從 Object 類的實例轉換爲 String 數據類型時,如果該實例爲 null,則返回字符串 "null"。否則,將返回字符串 "[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)); // 星期五 7 月 1 日 00:00:00 GMT-0700 2005

下表概述了在將其它數據類型轉換爲 String 數據類型時的結果:

數據類型或值

轉換爲 String 數據類型時的結果

Array

一個包含所有數組元素的字符串。

Boolean

"true" 或 "false"

Date

Date 對象的字符串表示形式。

null "null"

Number、int 或 uint

數字的字符串表示形式。

Object

如果實例爲 null,則結果爲 "null";否則爲 "[object Object]"

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章