这三个声明之间有什么区别吗?
var x;
var y:Object;
var z:*;
AS中有什么不是Object
吗?
答案 0 :(得分:3)
var x;
和var x:*;
对编译器来说意味着完全相同 - 变量可以接受任何类型。使用:*
而不是省略类型来增强代码的可读性。
实际上,var x:Object;
是等价的,因为你注意到一切都来自于对象。但是,编译器会将其视为不同,如果您访问非Object属性,它往往会稍微慢一些。此外,正如其他答案所述,尝试将undefined
分配给对象会自动将其转换为null
。
如果您的变量可以接受多个不相关的值类型,并且在将Object用作关联数组时使用:*
,建议您使用:Object
。
答案 1 :(得分:2)
undefined
以外的所有内容都是Object
,因此如果您希望var
使用undefined
值,请使用*
类型。
var a:*=undefined;
trace(a); // will trace undefined
var b:Object=undefined; // you will have a warning at compile time
trace(b); // will trace null
答案 2 :(得分:1)
主要区别在于*
可以分配undefined
和命名空间,而Object
则不能。其他一切都很好。
我建议尽可能使用Object
因为*
在AVM中有些奇怪。
答案 3 :(得分:-1)
在您的代码中,x未键入,y键入为Object类(所有ActionScript类的基础类),z键入任何类型的类。这样做的结果是,无论何时您需要引用这些变量的公共成员,您都需要将它们作为您要使用的类的实例进行转换,否则(在您的y对象的情况下,还有其他任何变量)未键入的变量)在引用它之前,您必须先测试y.hasOwnProperty("propertyName")
。
通常,您只能在方法参数中看到*,它可以使用多种类型的类。例如,您可能有一个像
这样的事件处理程序private function myHandler(event:*) : void {
//statements
}
其中event可以引用任何类型的事件,并且您的方法的代码将确定在对它执行任何操作之前的类型。