В чем разница между Object, * и вообще без типа?

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

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

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

4 ответа

Решение

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

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

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

Все кроме 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

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

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

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

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

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

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

Другие вопросы по тегам