У меня такой код:
for (i in awards) {
if (awards[i] instanceof Array === false) {
console.log(awards[i]);
httpFactory.patch(awards[i], {"read": true}, false);
}
}
Моя IDE показывает эту ошибку, связанную с приведенным выше кодом:
Возможная итерация по неожиданным (настраиваемым / унаследованным) членам, возможно, отсутствует проверка hasOwnProperty
Проверяет наличие нефильтрованных циклов for-in в JavaScript. Использование этой конструкции приводит к обработке унаследованных или неожиданных свойств. Вам необходимо отфильтровать собственные свойства с помощью метода hasOwnProperty (). Проверка работает в файлах JavaScript, html или jsp.
Не могли бы вы подробнее объяснить, что подразумевается под этим утверждением?
javascript
Прометей
источник
источник
hasOwnProperty
проверки - мне интересно, сколько предупреждений будет выдано ....Ответы:
IDE рекомендует добавить тест:
if (awards.hasOwnProperty(i)) { ... }
внутри
for
петли.Я лично рекомендую не делать этого и, если возможно, отключить предупреждение. Просто нет необходимости в большей части кода, и еще меньше необходимости в коде ES5, где вы можете безопасно добавлять неперечислимые свойства к объекту, используя
Object.defineProperty
hasOwnProperty
Проверка необходима только если вы небезопасное добавлены новые (перечисляемые) свойстваObject.prototype
, поэтому самое простое исправление не делает этого .jQuery не выполняет этот тест - они явно документируют, что jQuery сломается, если
Object.prototype
будет небезопасно изменен.источник
Каждый объект в javascript имеет прототип, который имеет свои собственные свойства (собственные / унаследованные методы / свойства) и свойства, которые напрямую привязаны к самому объекту.
Когда вы перебираете объект, он будет перебирать свойства самого объекта и свойства прототипа объекта.
Итак, чтобы избежать итерации по прототипу, рекомендуется использовать метод hasOwnProperty, который возвращает true только тогда, когда объект имеет указанное свойство напрямую. т.е. не внутри прототипа
пример
for (var k in object) { if (object.hasOwnProperty(k)) { // do your computation here. } }
Более подробную информацию можно найти здесь
источник
Вы также можете преобразовать свой цикл в:
const keys = Object.keys(object); for (const key of keys){ // do something with object[key]; }
источник
Также вы можете избавиться от предупреждения, написав цикл forEach для более удобочитаемого и функционального подхода:
Object.keys(object).forEach(key => { // Do something with object[key] });
источник
вы должны добавить еще одно условие в начале этого цикла
if (awards.hasOwnProperty(i))
источник