数据类型

数据类型用于定义一组值。例如,Boolean 数据类型所定义的一组值中仅包含两个值:truefalse。除了 Boolean 数据类型外,ActionScript 3.0 还定义了其它几个常用的数据类型,如 String、Number 和 Array。您可以使用类或接口来自定义一组值,从而定义自己的数据类型。ActionScript 3.0 中的所有值均是对象,无论这些值是基元值还是复杂值。

基元值是一个属于下列数据类型之一的值:Boolean、int、Number、String 和 uint。使用基元值的速度通常比使用复杂值的速度快,因为 ActionScript 按照一种尽可能优化内存和提高速度的特殊方式来存储基元值。

注: 关注技术细节的读者会发现,ActionScript 在内部将基元值作为不可改变的对象进行存储。这意味着按引用传递与按值传递同样有效。这可以减少内存的使用量并提高执行速度,因为引用通常比值本身小得多。

复杂值是指基元值以外的值。定义复杂值的集合的数据类型包括:Array、Date、Error、Function、RegExp、XML 和 XMLList。

许多编程语言都区分基元值及其包装对象。例如,Java 中有一个 int 基元值和一个包装它的 java.lang.Integer 类。Java 基元值不是对象,但它们的包装是对象,这使得基元值对于某些运算非常有用,而包装对象则更适合于其它运算。在 ActionScript 3.0 中,出于实用的目的,不对基元值及其包装对象加以区分。所有的值(甚至基元值)都是对象。运行时将这些基元类型视为特例,它们的行为与对象相似,但是不需要创建对象所涉及的正常开销。这意味着下面的两行代码是等效的:

var someInt:int = 3; 
var someInt:int = new int(3);

上面列出的所有基元数据类型和复杂数据类型都是由 ActionScript 3.0 核心类定义的。通过 ActionScript 3.0 核心类,可以使用字面值(而非 new 运算符)创建对象。例如,可以使用字面值或 Array 类的构造函数来创建数组,如下所示:

var someArray:Array = [1, 2, 3]; // literal value 
var someArray:Array = new Array(1,2,3); // Array constructor

类型检查

类型检查可以在编译时或运行时执行。静态类型语言(如 C++ 和 Java)在编译时执行类型检查。动态类型语言(如 Smalltalk 和 Python)在运行时执行类型检查。作为动态类型的语言,ActionScript 3.0 在运行时执行类型检查,同时也支持在称为严格模式的特殊编译器模式下在编译时执行类型检查。在严格模式下,类型检查既发生在编译时也发生在运行时,但是在标准模式下,类型检查仅发生在运行时。

在构造代码时,动态类型的语言带来了极大的灵活性,但代价是在运行时可能出现类型错误。静态类型的语言在编译时报告类型错误,但代价是要求类型信息在编译时是已知的。

编译时类型检查

在较大的项目中通常建议使用编译时类型检查,因为随着项目变大,相对于尽早捕获类型错误,数据类型的灵活性通常会变得不那么重要。这就是为什么将 Flash Professional 和 Flash Builder 中的 ActionScript 编译器默认设置为在严格模式下运行的原因。

Adobe Flash Builder

可以通过“项目属性”对话框中的 ActionScript 编译器设置在 Flash Builder 中禁用严格模式。

为了提供编译时类型检查,编译器需要知道代码中的变量或表达式的数据类型信息。为了显式声明变量的数据类型,请在变量名后面添加后跟数据类型的冒号运算符 (:) 作为其后缀。要将数据类型与参数相关联,应使用后跟数据类型的冒号运算符。例如,下面的代码向 xParam 参数中添加数据类型信息,并用显式数据类型声明变量 myParam

function runtimeTest(xParam:String) 
{ 
    trace(xParam); 
} 
var myParam:String = "hello"; 
runtimeTest(myParam);

在严格模式下,ActionScript 编译器将类型不匹配报告为编译器错误。例如,下面的代码声明一个 Object 类型的函数参数 xParam,但是之后又尝试向该参数赋予 String 类型和 Number 类型的值。这在严格模式下会产生编译器错误。

function dynamicTest(xParam:Object) 
{ 
    if (xParam is String) 
    { 
        var myStr:String = xParam; // compiler error in strict mode 
        trace("String: " + myStr); 
    } 
    else if (xParam is Number) 
    { 
        var myNum:Number = xParam; // compiler error in strict mode 
        trace("Number: " + myNum); 
    } 
}

但是,即使在严格模式下,也可以选择不在赋值语句右侧指定类型,从而退出编译时类型检查。可以通过省略类型注释或使用特殊的星号 (*) 类型注释,来将变量或表达式标记为无类型。例如,如果对上一个示例中的 xParam 参数进行修改,使其不再有类型注释,则代码会在严格模式下进行编译:

function dynamicTest(xParam) 
{ 
    if (xParam is String) 
    { 
        var myStr:String = xParam; 
        trace("String: " + myStr); 
    } 
    else if (xParam is Number) 
    { 
        var myNum:Number = xParam; 
        trace("Number: " + myNum); 
    } 
} 
dynamicTest(100) 
dynamicTest("one hundred");

运行时类型检查

在 ActionScript 3.0 中,无论是在严格模式下还是在标准模式下编译,在运行时都将进行类型检查。请考虑以下情形:将值 3 作为一个参数传递给需要数组的函数。在严格模式下,编译器将生成一个错误,因为值 3 与 Array 数据类型不兼容。如果您禁用严格模式而在标准模式下运行,则编译器不会指出类型不匹配,但在运行时进行类型检查时会产生运行时错误。

下面的示例演示一个名为 typeTest() 的函数,该函数需要一个 Array 参数,但传递的值却是 3。在标准模式下这会产生运行时错误,因为值 3 不是参数声明的数据类型 (Array) 的成员。

function typeTest(xParam:Array) 
{ 
    trace(xParam); 
} 
var myNum:Number = 3; 
typeTest(myNum);  
// run-time error in ActionScript 3.0 standard mode

还可能会出现如下情形:即使在严格模式下运行,也可能会获得运行时类型错误。如果您使用严格模式,但是通过使用无类型变量而退出了编译时类型检查,就可能会出现上述情形。当您使用无类型变量时,并不会消除类型检查,而只是将其延迟到运行时执行。例如,如果上一个示例中的 myNum 变量没有已声明的数据类型,则编译器无法检测到类型不匹配,但代码会生成运行时错误,因为它会将 myNum 的运行时值(赋值语句将其设为 3)与 xParam 的类型(设置为 Array 数据类型)进行比较。

function typeTest(xParam:Array) 
{ 
    trace(xParam); 
} 
var myNum = 3; 
typeTest(myNum);  
// run-time error in ActionScript 3.0

与编译时类型检查相比,运行时类型检查还允许更灵活地使用继承。标准模式会将类型检查延迟到运行时执行,从而使您可以引用子类的属性,即使您上传也是如此。当您使用基类来声明类实例的类型,但是使用子类来实例化类实例时,就会发生上传。例如,您可以创建一个名为 ClassBase 的可扩展类(具有 final 属性的类不能扩展):

class ClassBase 
{ 
}

随后,您可以创建一个名为 ClassExtender 的 ClassBase 子类,该子类具有一个名为 someString 的属性,如下所示:

class ClassExtender extends ClassBase 
{ 
    var someString:String; 
}

通过使用这两个类,可以创建一个使用 ClassBase 数据类型进行声明、但使用 ClassExtender 构造函数进行实例化的类实例。上传被视为安全操作,这是因为基类不包含子类中没有的任何属性或方法。

var myClass:ClassBase = new ClassExtender();

但是,子类中则包含其基类中没有的属性或方法。例如,ClassExtender 类中包含 someString 属性,该属性在 ClassBase 类中不存在。在 ActionScript 3.0 标准模式下,可以使用 myClass 实例来引用此属性,而不会生成编译时错误,如下面的示例所示:

var myClass:ClassBase = new ClassExtender(); 
myClass.someString = "hello"; 
// no error in ActionScript 3.0 standard mode

is 运算符

is 运算符可用来测试变量或表达式是否为给定数据类型的成员。在早期的 ActionScript 版本中,此功能由 instanceof 运算符提供。但在 ActionScript 3.0 中,不应使用 instanceof 运算符来测试变量或表达式是否为数据类型的成员。对于手动类型检查,应用 is 运算符来代替 instanceof 运算符,因为表达式 x instanceof y 只是在 x 的原型链中检查 y 是否存在(在 ActionScript 3.0 中,原型链不能全面地描述继承层次)。

is 运算符检查正确的继承层次,不但可以用来检查对象是否为特定类的实例,而且还可以检查对象是否是用来实现特定接口的类的实例。下面的示例创建 Sprite 类的一个名为 mySprite 的实例,并使用 is 运算符来测试 mySprite 是否为 Sprite 和 DisplayObject 类的实例,以及它是否实现 IEventDispatcher 接口:

var mySprite:Sprite = new Sprite(); 
trace(mySprite is Sprite); // true 
trace(mySprite is DisplayObject);// true 
trace(mySprite is IEventDispatcher); // true

is 运算符检查继承层次,并正确地报告 mySprite 与 Sprite 和 DisplayObject 类兼容(Sprite 类是 DisplayObject 类的子类)。is 运算符还检查 mySprite 是否是从实现 IEventDispatcher 接口的任意类继承的。由于 Sprite 类是从实现 IEventDispatcher 接口的 EventDispatcher 类继承的,因此 is 运算符会正确地报告 mySprite 也实现该接口。

下面的示例说明与上一个示例相同的测试,但使用的是 instanceof 运算符,而不是 is 运算符。instanceof 运算符正确地识别出 mySprite 是 Sprite 或 DisplayObject 的实例,但是,当该运算符用于测试 mySprite 是否实现 IEventDispatcher 接口时,返回的却是 false

trace(mySprite instanceof Sprite); // true 
trace(mySprite instanceof DisplayObject);// true 
trace(mySprite instanceof IEventDispatcher); // false

as 运算符

as 运算符也可用来检查表达式是否为给定数据类型的成员。但是,与 is 运算符不同的是,as 运算符不返回布尔值。as 运算符返回表达式的值(代替 true)或 null(代替 false)。下面的示例演示在检查 Sprite 实例是否为 DisplayObject、IEventDispatcher 和 Number 数据类型的成员这样的简单情况下,使用 as 运算符替代 is 运算符的结果。

var mySprite:Sprite = new Sprite(); 
trace(mySprite as Sprite);                 // [object Sprite] 
trace(mySprite as DisplayObject);                 // [object Sprite] 
trace(mySprite as IEventDispatcher);                 // [object Sprite] 
trace(mySprite as Number);                                       // null

在使用 as 运算符时,右侧的操作数必须是数据类型。如果尝试使用表达式(而非数据类型)作为右侧的操作数,将会产生错误。

动态类

动态类定义在运行时可通过添加或更改属性和方法来改变的对象。非动态类(如 String 类)是密封类。您不能在运行时向密封类中添加属性或方法。

在声明类时,可以通过使用 dynamic 属性来创建动态类。例如,下面的代码创建一个名为 Protean 的动态类:

dynamic class Protean 
{ 
    private var privateGreeting:String = "hi"; 
    public var publicGreeting:String = "hello"; 
    function Protean() 
    { 
        trace("Protean instance created"); 
    } 
}

如果要在以后实例化 Protean 类的实例,可以在类定义的外部向其添加属性或方法。例如,下面的代码创建 Protean 类的一个实例,并向该实例中添加两个名称分别为 aStringaNumber 的属性:

var myProtean:Protean = new Protean(); 
myProtean.aString = "testing"; 
myProtean.aNumber = 3; 
trace(myProtean.aString, myProtean.aNumber); // testing 3

添加到动态类实例中的属性是运行时实体,因此会在运行时完成所有类型检查。不能向以这种方式添加的属性中添加类型注释。

您还可以定义一个函数并将该函数附加到 myProtean 实例的某个属性,从而向 myProtean 实例中添加方法。下面的代码将 trace 语句移到一个名为 traceProtean() 的方法中:

var myProtean:Protean = new Protean(); 
myProtean.aString = "testing"; 
myProtean.aNumber = 3; 
myProtean.traceProtean = function () 
{ 
    trace(this.aString, this.aNumber); 
}; 
myProtean.traceProtean(); // testing 3

但是,以这种方式创建的方法对于 Protean 类的任何私有属性或方法都不具有访问权限。而且,即使对 Protean 类的公共属性或方法的引用也必须用 this 关键字或类名进行限定。下面的示例说明了 traceProtean() 方法,该方法尝试访问 Protean 类的私有变量和公共变量。

myProtean.traceProtean = function () 
{ 
    trace(myProtean.privateGreeting); // undefined 
    trace(myProtean.publicGreeting); // hello 
}; 
myProtean.traceProtean();

数据类型说明

基元数据类型包括 Boolean、int、Null、Number、String、uint 和 void。ActionScript 核心类还定义下列复杂数据类型:Object、Array、Date、Error、Function、RegExp、XML 和 XMLList。

Boolean 数据类型

Boolean 数据类型包含两个值:truefalse。对于 Boolean 类型的变量,其它任何值都是无效的。已经声明但尚未初始化的布尔变量的默认值是 false

int 数据类型

int 数据类型在内部存储为 32 位整数,包含的整数集从

-2,147,483,648 (-231) 至 2,147,483,647 (231 - 1) 之间(两端包含在内)。早期的 ActionScript 版本仅提供 Number 数据类型,该数据类型既可用于整数又可用于浮点数。在 ActionScript 3.0 中,现在可以访问 32 位带符号整数和无符号整数的低位机器类型。如果您的变量不需要浮点数,那么,使用 int 数据类型来代替 Number 数据类型会更快更高效。

对于小于 int 的最小值或大于 int 的最大值的整数值,应使用 Number 数据类型。Number 数据类型可以处理 -9,007,199,254,740,992 和 9,007,199,254,740,992(53 位整数值)之间的值。int 数据类型的变量的默认值是 0。

Null 数据类型

Null 数据类型仅包含一个值:null。这是 String 数据类型和用来定义复杂数据类型的所有类(包括 Object 类)的默认值。其它基元数据类型(如 Boolean、Number、int 和 uint)均不包含 null 值。在运行时,如果尝试将 null 分配给 Boolean、Number、int 或 uint 类型的变量,则值null 会转换为相应的默认值。不能将 Null 数据类型用作类型注释。

Number 数据类型

在 ActionScript 3.0 中,Number 数据类型可以表示整数、无符号整数和浮点数。但是,为了尽可能提高性能,应将 Number 数据类型仅用于浮点数,或者用于 intuint 类型可以存储的、大于 32 位的整数值。要存储浮点数,数字中应包括一个小数点。如果您省略小数点,数字将存储为整数。

Number 数据类型使用由 IEEE 二进制浮点算术标准 (IEEE-754) 指定的 64 位双精度格式。此标准规定如何使用 64 个可用位来存储浮点数。其中的 1 位用来指定数字是正数还是负数。11 位用于指数,以 2 为底进行存储。其余的 52 位用于存储有效位数(又称为尾数),有效位数是 2 的 N 次幂,N 即前面所提到的指数。

可以将 Number 数据类型的所有位都用于有效位数,也可以将 Number 数据类型的某些位用于存储指数,后者可存储的浮点数比前者大得多。例如,如果 Number 数据类型使用全部 64 位存储有效位数,则可以存储的最大数字为 265 - 1。如果使用 11 位存储指数,则 Number 数据类型可以存储的最大有效数字为 21023

Number 类型可以表示的最大值和最小值存储在 Number 类的名为 Number.MAX_VALUENumber.MIN_VALUE 的静态属性中。

Number.MAX_VALUE == 1.79769313486231e+308 
Number.MIN_VALUE == 4.940656458412467e-324

尽管这个数字范围很大,但代价是此范围的精度有所降低。Number 数据类型使用 52 位来存储有效位数,因此,那些要求用 52 位以上的位数才能精确表示的数字(如分数 1/3)将只是近似值。如果应用程序要求小数达到绝对精度,则需要使用实现小数浮点算术(而非二进制浮点算术)的软件。

如果用 Number 数据类型来存储整数值,则仅使用 52 位有效位数。Number 数据类型使用这 52 位和一个特殊的隐藏位来表示从 -9,007,199,254,740,992 (-253) 到 9,007,199,254,740,992 (253) 的整数。

NaN 值不仅用作 Number 类型的变量的默认值,还用作应返回数字却没有返回数字的任何运算的结果。例如,如果您尝试计算负数的平方根,结果会是 NaN。其它特殊的 Number 值包括正无穷大负无穷大

注: 在被 0 除时,如果被除数也是 0,则结果只有一个,那就是 NaN。在被 0 除时,如果被除数是正数,则结果为“正无穷大”;如果被除数是负数,则结果为“负无穷大”。

String 数据类型

String 数据类型表示一个 16 位字符的序列。字符串在内部存储为 Unicode 字符,并使用 UTF-16 格式。字符串是不可改变的值,就像在 Java 编程语言中一样。对字符串值的操作返回字符串的一个新的实例。用字符串数据类型声明的变量的默认值是 null。值 null 与空字符串 ("") 不同。值 null 表示变量中未存储任何值,而空字符串表示变量中有一个 String 值,但其中不包含任何字符。

uint 数据类型

uint 数据类型在内部存储为 32 位无符号整数,包含的整数集介于 0 和 4,294,967,295 (232 - 1) 之间(包括 0 和 4,294,967,295)。uint 数据类型可用于要求非负整数的特殊情形。例如,必须使用 uint 数据类型来表示像素颜色值,因为 int 数据类型有一个内部符号位,该符号位并不适合处理颜色值。对于大于 uint 的最大值的整数值,应使用 Number 数据类型,该数据类型可以处理 53 位整数值。uint 数据类型的变量的默认值是 0。

void 数据类型

void 数据类型仅包含一个值:undefined。在早期的 ActionScript 版本中,undefined 是 Object 类实例的默认值。在 ActionScript 3.0 中,Object 实例的默认值是 null。如果您尝试将值 undefined 赋予 Object 类的实例,则该值会转换为 null。您只能为无类型变量赋予 undefined 这一值。无类型变量是指缺乏类型注释或者使用星号 (*) 作为类型注释的变量。您可以将 void 只用作返回类型注释。

Object 数据类型

Object 数据类型是由 Object 类定义的。Object 类用作 ActionScript 中的所有类定义的基类。ActionScript 3.0 中的 Object 数据类型与早期版本中的 Object 数据类型存在以下三方面的区别:第一,Object 数据类型不再是指定给没有类型注释的变量的默认数据类型。第二,Object 数据类型不再包括 undefined 这一值,该值以前是 Object 实例的默认值。第三,在 ActionScript 3.0 中,Object 类实例的默认值是 null

在早期的 ActionScript 版本中,会自动为没有类型注释的变量赋予 Object 数据类型。ActionScript 3.0 现在包括真正无类型变量这一概念,因此不再为没有类型注释的变量赋予 Object 数据类型。没有类型注释的变量现在被视为无类型变量。如果您希望向代码的读者清楚地表明您是故意将变量保留为无类型,可以使用星号 (*) 表示类型注释,这与省略类型注释等效。下面的示例演示两条等效的语句,两者都声明一个无类型变量 x

var x 
var x:*

只有无类型变量才能保存值 undefined。如果您尝试将值 undefined 赋给具有数据类型的变量,则运行时会将值 undefined 转换为该数据类型的默认值。对于 Object 数据类型的实例,默认值为 null,这表示如果您尝试将 undefined 分配给 Object 实例,该值会转换为 null

类型转换

在将某个值转换为其它数据类型的值时,就说发生了类型转换。类型转换可以是隐式的,也可以是显式的。隐式转换也称为强制转换,有时在运行时执行。例如,如果将值 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]"