分类:
2010-07-16 17:04:08
代码如下:
var x;
var x:*;
都是声明一个变量x并且可以存放任意类型数据,乍一看来,*数据类型纯属多余,其所有的功能就是让您输入更多代码给您的代码添乱子,横竖就是可以省略掉的类型,真的是这样的吗?
当然,不声明一个变量的类型比声明该变量为任意类型更加的容易,然后,使用*类型有以下一些很重要的优点:
n 在严格编译模式(strict compilation mode)下,类型检测可以通过。这样可以消除“变量’x'没有声明类型的”和“函数返回值没有声明类型”这样的警告信息。
n 您的代码传达它的意图 - 极限编程的方法
n 类型的变量可以存储未定义值(undefined)
在第2点上,所有使用*类型替代不声明类型更加恰当是因为它能够更加恰当的传达您的实际意图。您正在告诉查看您代码的任何人:“是的,这个变量实际就是要没有类型”。如果不声明一个变量的类型的话,它有两层意思 -您真的想它未声明类型(这种情况您应该使用*),或者您不喜欢声明变量因为不声明更容易(这种情况下,您实际应该声明变量类型以使用强类型检测带来的诸多好处,包括编译器的更快速的执行和帮助)。
数据类型的另外一个重要使用情景是您将undefined用来赋值,因为语言的变化,某些数据类型已经不再可以存放undefined值了,例如,考虑以下ActionScript 2代码:
var x:Number = 17;
x = undefined;
trace( x ); // 输出: undefined
试图在ActionScript 3中做同样的事情的话,将得到不同的结果:
var x:Number = 17;
x = undefined;
trace( x ); // 输出:
实际上,如果我们将Number改为int,试图将其值设置为undefined将导致该变量的值为缺省值:0:
var x:int = 17;
x = undefined;
trace( x ); // 输出: 0
但是如果您真的想能够存储undefined值该怎么办呢?这类似C#的Nullable类型(顺便说下,包括它的规则)。在ActionScript 3中相同类型的功能只能通过使用*类型替代int类型来实现。
正如您所看到的,*类型是ActionScript 3的一个重要增加,是否您想将类型检测推迟到运行时检测,想明确声明您也不知道某变量是何种类型,或者您想将undefined作为正确的值,大约以后您将会看到很多*类型。
举例:
(1) var ichild:* = mod.child as IModuleInterface;
IModuleInterface是一个接口,mod.child对象实现了该接口。