在将某个值转换为其它数据类型的值时,就说发生了类型转换。类型转换可以是隐式的,也可以是显式的。隐式转换也称为强制转换,有时在运行时执行。例如,如果将值 2 赋给 Boolean 数据类型的变量,则值 2 会先转换为布尔值 true,然后再将其赋给该变量。显式转换又称为转换,在代码指示编译器将一个数据类型的变量视为属于另一个数据类型时发生。在涉及基元值时,转换功能将一个数据类型的值实际转换为另一个数据类型的值。要将对象转换为另一类型,请用小括号括起对象名并在它前面加上新类型的名称。例如,下面的代码提取一个布尔值并将它转换为一个整数:
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。如果由于某些原因不能转换数值,则会将默认值 0 赋给 int 和 uint 数据类型,将默认值 NaN 赋给 Number 数据类型。如果将布尔值转换为数字,则 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() 函数提供的字符串中包含前导 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; // 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
|
Object
|
如果实例为 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
在将字符串值转换为 Boolean 数据类型时,如果字符串为 null 或空字符串 (""),则会返回 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 数据类型不是避免在严格模式下出错所必需的。下面的几个示例全部是在严格模式下编译的,它们在运行时按照预期的方式工作:
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。
|
Object
|
如果实例为 null,则结果为 false;否则为 true。
|
转换为 String
从任何数值数据类型转换为 String 数据类型时,都会返回数字的字符串表示形式。在将布尔值转换为 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 数据类型时的结果:
数据类型或值
|
转换为 String 数据类型时的结果
|
Array
|
由所有数组元素组成的字符串。
|
Boolean
|
“true”或“false”
|
Date
|
Date 对象的字符串表示形式。
|
null
|
"null"
|
Number、int 或 uint
|
数字的字符串表示形式。
|
Object
|
如果实例为 null,则结果为 "null";否则为 "[object Object]"。
|