В чем разница между Object, * и вообще без типа? - PullRequest
2 голосов
/ 02 августа 2010

Есть ли разница между этими тремя декларациями?

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

Есть ли в AS что-нибудь, кроме Object?

Ответы [ 4 ]

3 голосов
/ 02 августа 2010

var x; и var x:*; означают для компилятора одно и то же - переменная может принимать любой тип. Используйте :* вместо пропуска типа для улучшения читабельности вашего кода.

Практически, var x:Object; эквивалентно, поскольку, как вы заметили, все происходит от Объекта. Однако компилятор обрабатывает его по-другому, и он имеет тенденцию быть немного медленнее, если вы обращаетесь к свойствам не-объекта. Кроме того, как отмечалось в других ответах, попытка присвоить объекту undefined автоматически приведёт его к null.

Я рекомендую использовать :*, если ваша переменная может принимать более одного несвязанного типа значения, и использовать :Object при использовании объекта в качестве ассоциативного массива.

2 голосов
/ 02 августа 2010

Все, кроме 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
1 голос
/ 02 августа 2010

Основное отличие состоит в том, что * может быть назначено undefined и пространству имен, тогда как Object не может.Все остальное хорошо для обоих.

Я бы рекомендовал использовать Object, где это возможно, так как * имеет некоторую странность в AVM.

0 голосов
/ 02 августа 2010

В вашем коде x не типизирован, y - как класс Object (базовый класс всех классов ActionScript), а z - как любой тип класса.Результатом этого является то, что в любое время, когда вам нужно сослаться на открытые члены этих переменных, вам нужно будет либо привести их в качестве экземпляров класса, который вы хотите использовать, либо (в случае вашего объекта Object, но также и любого другого).(нетипизированные переменные) вам придется проверить, если y.hasOwnProperty("propertyName"), прежде чем ссылаться на него.

Обычно вы видите только аргументы * in метода, которые могут принимать более одного типа класса.Например, у вас может быть обработчик события, например

private function myHandler(event:*) : void {
  //statements
}

, где событие может относиться к любому типу события, а код вашего метода будет определять, какой тип был до того, как что-то с ним делать.

...