В чем преимущество нетипизированной переменной над объектом? В чем разница между null и undefined?

согласно этому : 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?");


два вопросы:

  • почему назначение undefined разрешено для obj? (не большая проблема, так как он по-прежнему печатает как null)
  • если мы сравниваем null с undefined результат true (даже если null хранится в объекте). Какой смысл делать различие между null и undefined, если они равны?

2 ответов


  • Flash имеет преобразование типов для преобразования некоторых типов.

некоторые примеры этого:

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

или:

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

поэтому, когда вы присваиваете undefined to Object экземпляр Flash преобразует его в null таким же образом.

  • ваше сравнение применяется преобразование типов на несовместимых типах перед оценкой Boolean.

вы можете использовать строгое сравнение, чтобы иметь false:

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

некоторые значения тихо преобразуются для сравнения или назначения.

одним из таких преобразований является преобразование undefined перейти к null при повышении до Object. Отсюда null == undefined потому что в основном было сделано на самом деле Object(null) == Object(undefined) и это null == null.

однако, если вы делаете строгое сравнение, они не преобразуются и, следовательно, не равны, т. е. null === undefined даст false.