Подтвердить что ты не робот

Возможная итерация 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.

Не могли бы вы более подробно объяснить, что подразумевается под этим утверждением?

4b9b3361

Ответ 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))