无类型变量对对象有什么好处? null和undefined有什么区别?

时间:2011-08-08 09:49:45

标签: flash flex actionscript-3 actionscript

据此:http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9f.html引用:

  

无类型变量与Object类型的变量不同。关键的区别在于,无类型变量可以保持特殊值undefined,而Object类型的变量不能保存该值。

然而,当我测试它时:


            var objTest:Object = 123;           
            var untypedTest:* = 123;

            objTest = undefined;
            untypedTest = undefined;            
            //This is understandable but why was the assignment even allowed?
            trace(objTest); // prints null
            trace(untypedTest); // prints undefined

            objTest=null;
            untypedTest = null;         
            //This is also understandable ... both can store null 
            trace(objTest); // prints null 
            trace(untypedTest); // prints null 

            //If they are null whey are they being equal to undefined? 
            if(objTest==undefined)
                trace("obj is undefined");
            if(untypedTest==undefined)
                trace("untyped is undefined");
            //Because null is same as undefined!
            if(null==undefined)
                trace("null is same as undefined?");


两个问题:

  • 为什么obj允许赋值为undefined? (这不是一个大问题,因为它仍然打印为空)
  • 如果我们将null与undefined进行比较结果为true(即使null存储在Object中)。如果它们相等,那么在null和undefined之间做出区别的重点是什么?

2 个答案:

答案 0 :(得分:10)

  • Flash具有转换某些类型的类型转换。

一些样本:

var i:int = NaN;
trace (i); // 0

或者:

var b:Boolean = null;
trace(b); // false

因此,当您将undefined分配给Object实例时,Flash会以相同的方式将其转换为null

  • 在评估Boolean之前,您的比较在不兼容类型上应用了类型转换。

您可以使用严格比较来false

if(null === undefined)
    trace("Never traced: null is not the same as undefined!");

答案 1 :(得分:0)

某些值会被静默转换以进行比较或分配。

一种此类转化是undefined在晋升为null时转换为Object的转化。因此null == undefined因为基本上已经完成的是Object(null) == Object(undefined),那就是null == null

但是,如果你进行严格的比较,它们不会被转换,因此不相等,即null === undefined将产生错误。