В чем преимущество нетипизированной переменной над объектом?В чем разница между нулевым и неопределенным? - PullRequest
7 голосов
/ 08 августа 2011

В соответствии с этим: http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9f.html Цитата:

Нетипизированная переменная не совпадает с переменной типа Object.Основное отличие состоит в том, что нетипизированные переменные могут содержать специальное значение неопределенным, в то время как переменная типа 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?(не большая проблема, поскольку он все еще печатает как ноль)
  • Если мы сравним ноль с неопределенным результатом, то истина (даже если ноль хранится в объекте).Какой смысл делать различие между нулем и неопределенным, если они равны?

Ответы [ 2 ]

10 голосов
/ 08 августа 2011
  • 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!");
0 голосов
/ 08 августа 2011

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

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

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

...