Возможная итерация JavaScript над непредвиденным
У меня есть следующий код:
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.
Не могли бы вы более подробно объяснить, что подразумевается под этим утверждением?
Ответы
Ответ 1
В среде IDE рекомендуется добавить тест:
if (awards.hasOwnProperty(i)) {
...
}
внутри цикла for
.
Я лично рекомендую не делать этого и отключать предупреждение, если это возможно. Просто нет необходимости в большинстве кода и даже меньше необходимости в коде ES5, где вы можете безопасно добавлять неперечислимые свойства к объекту с помощью Object.defineProperty
Проверка hasOwnProperty
необходима только в том случае, если вы не добавили новые (перечисляемые) свойства в Object.prototype
, поэтому простейшее исправление не делает этого.
jQuery не выполняет этот тест - они явно документируют, что jQuery будет разорваться, если Object.prototype
будет неправильно изменено.
Ответ 2
Каждый объект в javascript имеет прототип, который имеет свои собственные свойства (собственные/унаследованные методы/свойства) и свойства, которые непосредственно привязаны к самому объекту.
Когда вы перебираете объект, он будет перебирать свойства самого объекта и свойства прототипа объекта.
Итак, чтобы избежать повторения прототипа, рекомендуется использовать метод hasOwnProperty, который возвращает true только тогда, когда объект имеет указанное свойство напрямую. т.е. не внутри прототипа
Пример
for (var k in object) {
if (object.hasOwnProperty(k)) {
// do your computation here.
}
}
Более подробную информацию можно найти здесь
Ответ 3
вы должны добавить еще одно условие в начале этого цикла
if (awards.hasOwnProperty(i))