Object,*和没有类型之间的区别是什么?

时间:2010-08-02 16:42:22

标签: actionscript-3 redundancy dynamic-typing weak-typing

这三个声明之间有什么区别吗?

var x;
var y:Object;
var z:*;

AS中有什么不是Object吗?

4 个答案:

答案 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可以引用任何类型的事件,并且您的方法的代码将确定在对它执行任何操作之前的类型。