【问题标题】:What's the difference between Object, *, and no type at all?Object、* 和 no type 之间有什么区别?
【发布时间】:2011-03-24 07:42:51
【问题描述】:

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

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

AS 中有什么不是Object

【问题讨论】:

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


【解决方案1】:

var x;var x:*; 对编译器的含义完全相同——变量可以接受任何类型。使用:* 而不是省略类型来提高代码的可读性。

实际上,var x:Object; 是等价的,因为正如您所指出的,一切都源自 Object。但是,编译器对它的处理不同,如果您访问的是非对象属性,它往往会稍微慢一些。此外,正如其他答案所指出的,尝试将 undefined 分配给 Object 会自动将其转换为 null

如果您的变量可以接受一种以上不相关类型的值,我建议使用:*,并且在将对象用作关联数组时使用:Object

【讨论】:

    【解决方案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
    

    【讨论】:

      【解决方案3】:

      主要区别在于* 可以分配undefined 和命名空间,而Object 不能。其他一切都很好。

      我建议尽可能使用 Object,因为 * 在 AVM 中有些奇怪。

      【讨论】:

        【解决方案4】:

        在您的代码中,x 没有类型化,y 类型化为 Object 类(所有 ActionScript 类的基础类),z 类型化为任何类型的类。这样做的结果是,每当您需要引用这些变量的公共成员时,您要么需要将它们转换为您要使用的类的实例,要么(在您的 y 对象的情况下,以及任何其他非类型变量)你必须在引用它之前测试y.hasOwnProperty("propertyName")

        通常你只会看到方法参数中的 * 可以接受不止一种类型的类。例如,您可能有一个像

        这样的事件处理程序
        private function myHandler(event:*) : void {
          //statements
        }
        

        其中 event 可以引用任何类型的事件,并且您的方法的代码将确定在对其进行任何操作之前是哪种类型。

        【讨论】:

        • 您不必在访问它们的属性之前强制转换无类型或对象类型的变量。事实上,投射比直接访问它们要慢得多(50%+)。 AS3 是一种动态语言。此外,x 和 z 完全相同——两种语法之间没有语义差异。
        猜你喜欢
        • 2011-01-14
        • 1970-01-01
        • 2015-04-15
        • 1970-01-01
        • 2013-05-31
        • 2018-06-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多