类型转换
在将某个值转换为其它数据类型的值时,就说发生了类型转换。类型转换可以是“隐式的”,也可以是“显式的”。隐式转换又称为“强制”,有时由 Flash Player 在运行时执行。例如,如果将值 2 赋给 Boolean 数据类型的变量,则 Flash Player 会先将值 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; // 转换成功。 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.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; // 将 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 |
如果值为 |
Date |
Date 对象的内部表示形式,即从 1970 年 1 月 1 日午夜(通用时间)以来所经过的毫秒数。 |
null |
0 |
Object |
如果实例为 |
String |
如果 Flash Player 可以将字符串转换为数字,则结果为数字;否则,如果转换为 Number,则结果为 |
|
如果转换为 Number,则结果为 |
转换为 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 |
Number、int 或 uint |
如果值为 |
Object |
如果实例为 |
转换为 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 |
|
Date |
Date 对象的字符串表示形式。 |
null |
"null" |
Number、int 或 uint |
数字的字符串表示形式。 |
Object |
如果实例为 null,则结果为 |