2016-08-31 2 views
3

Я довольно новичок в javascript, и я пытаюсь перебирать ключ/значения словарей. (И да, я прочитал несколько постов здесь, но не нашел answere для.)hasOwnProperty при итерации по словарю

Так что это мой словарь:

showhidedict = { 
    0: ["a"], 
    1: [], 
    2: ["a", "b"], 
    3: [] 
}; 

это моя итерация:

for (var value in showhidedict) 
    $("#" + showhidedict[value]).hide(); 

ReSharper предлагает мне добавить hasOwnProperty -check в петлю:

if (showhidedict.hasOwnProperty(value)) 

Но почему?

hasOwnProperty -check проверяет, имеет ли объект атрибут (здесь, содержит ли словарь ключ), правильно? Но мне действительно нужен чек? Поскольку я перебираю ключи, я знаю, что все ключи должны существовать. Есть ли другие вопросы, почему я должен добавить чек?

+0

Объекты наследуют свойства от других объектов, то есть 'obj [" foo "]' может возвращать значение (и '' foo "в obj' будет истинным), даже если' obj.hasOwnProperty ("foo") 'false , – melpomene

+0

Что делает Resharper ** sugesting **, чтобы убедиться, что ваша структура данных действительна. Итак, когда вы берете какой-то элемент из объекта, вы не выбрасываете его. –

+0

Ваша форма проверки 'hasOwnProperty' неверна. Это должно быть 'if (Object.prototype.hasOwnProperty.call (showhideict, value))'; иначе код выйдет из строя, если одно из свойств данных в 'showhidedict' называется' hasOwnProperty'. – melpomene

ответ

2

Обычно рекомендуется всегда использовать hasOwnProperty, поскольку указывает, имеет ли объект указанное свойство на самом объекте и избегает поиска в цепочке прототипов.

Как правило, вы никогда не должны думать о среде, в которой работает код, или когда ваш объект создан другой библиотекой, или прототип расширен, поэтому hasOwnProperty делает ваш код «более безопасным».

Дополнительная информация о prototype chain.

Ссылка на Object.prototype.hasOwnProperty().

+0

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

+1

Вы должны включить более подробную информацию о том, какой вариант использования будет для этого, поскольку они, вероятно, не знакомы с расширением прототипа, если они задают этот вопрос. Ваш ответ имеет смысл для тех, кто уже понимает эту концепцию, но не помогает обучать кого-то незнакомого. – 4castle

+0

@ 4castle Спасибо за ваш комментарий, да хорошая идея, я включил некоторые ресурсы, указывающие, как работает прототип js. +1 за ваше предложение. – GibboK

1

Если вы используете ключевое слово in для итерации, вы повторяете свойства объекта, возвращаемые ключи - это строки, а не числа. В этом контексте итерационных свойств разумно всегда проверять, что вы выполняете только собственные свойства объекта, а не какой-то мусор, лежащий в цепочке прототипов.

Для повторного использования Arraylike рекомендуемая итерация, вероятно, по-прежнему использует обычный цикл цикла с индексом увеличения. Этот индекс будет числом, он будет полагаться на свойство length, которое имеет Arraylikes. Не нужно проверять hasOwnProperty.

Это, как говорится, я не думаю, что код, который вы написали, неверен, но особенно в командных средах или использовании внешних API-интерфейсов, вероятно, разумно использовать один из двух вышеуказанных методов. Resharper - все о том, чтобы быть разумным с вашим кодом.

+0

, поэтому, если я работаю с внешним объектом (другим API, а не моим), я должен его использовать? –

+0

@MatthiasBurger определенно, если ваш объект создан другим API, вы не должны делать никаких предположений и сделать ваш код более безопасным, используя hasOwnProperty, как предложено resharper. Я дал вам ссылку с некоторыми дополнительными ресурсами на мой ответ, надеюсь, вы найдете их полезными. Если у вас есть какие-либо вопросы, сообщите нам об этом. Благодаря! – GibboK

Смежные вопросы