В ActionScript 3, в чем разница между оператором «in» и методом «hasOwnProperty»? - PullRequest
15 голосов
/ 30 июля 2011

Оператор "in" и методы "hasOwnProperty" кажутся взаимозаменяемыми, но мне интересно, проверяет ли один на унаследованные свойства или что-то, а другой нет или что-то в этом роде. Меня особенно интересует случай использования его со словарем, но я сомневаюсь, что он отличается от других.

"hasOwnProperty" описывается в официальных документах здесь , а "in" описывается здесь , но если есть разница, я не нашел ее очень четкой.

Ответы [ 2 ]

14 голосов
/ 04 августа 2011

Доверие к драгоценно принятому ответу на самом деле доставило мне немного неприятностей. Кажется, что происходит нечто большее, чем просто различия, связанные с прототипом. Я обнаружил, что

hasOwnProperty нельзя использовать для проверки наличия ключа в словаре, если этот ключ является ссылочным типом, но оператор in может.

Вот пример для демонстрации.

код:

var test:Function = function(key:*,label:String):void
    {
        var d:Dictionary = new Dictionary(true);
        d[key] = true;
        trace(label);
        trace("  hasOwnProperty: " + (d.hasOwnProperty(key)?"true":"false <== !!PROBLEM!!"));
        trace("  in: " + (key in d));
        trace("  []: " + d[key]);
    };
test({}, "indexed by object");
test("string", "key is string");
test(0, "key is number");
test(true, "key is boolean");

Результаты:

indexed by object
  hasOwnProperty: false <== !!PROBLEM!!
  in: true
  []: true
key is string
  hasOwnProperty: true
  in: true
  []: true
key is number
  hasOwnProperty: true
  in: true
  []: true
key is boolean
  hasOwnProperty: true
  in: true
  []: true
4 голосов
/ 30 июля 2011

Я знаю, что изменение in ищет цепочку прототипов, а hasOwnProperty - нет, большинство разработчиков AS3 не используют прототипы, так что это не так уж важно для повседневного использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...