В чем разница между 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
}
где событие может относиться к любому типу события, а код вашего метода будет определять, какой тип был до того, как что-либо делать с ним.