JavaScript: ошибка JSLint "Тело for in должно быть заключено в оператор if для фильтрации нежелательных свойств из прототипа"

Я использую инструмент JSLint, чтобы убедиться, что мой JavaScript "строгий".

Я получаю следующую ошибку, но не понимаю, как ее исправить:

The body of a for in should be wrapped in an if statement to filter unwanted properties from the prototype

Для следующего кода:

for (var i in keypairs) {
    ...
}

У любого есть идеи, как это исправить, чтобы JavaScript был "строгим" и не был помечен JSLint

5 ответов

Если keypairs это массив, тогда вы должны действительно перебирать элементы вроде:

for(var i = 0; i < keypairs.length; i++) {
  ...
}

Если keypairs является хэшем, то JSLint правильно рекомендует проверить, что вы работаете с соответствующим типом ключа (т. е. подтверждаете, что хеш - это ожидаемый тип)

так что-то вроде

for(var i in keypairs) {
  if(keypairs.hasOwnProperty(i)) {
    ...
  }
}

где if проверяет любые критерии, гарантирующие, что вы не обращаетесь к функции-прототипу и т. д.

Он хочет, чтобы вы использовали hasOwnProperty,

for (var i in keypairs) {
    if(keypairs.hasOwnProperty(i))
    {
        // Use i
    }
}

Как и большая часть JSLint, это рекомендация, и ее применимость зависит от вашей ситуации. Это полезно, если в прототипе объекта есть нежелательные перечисляемые свойства. Это может иметь место, если вы, например, используете определенные библиотеки JavaScript.

Проблема с for...in в том, что вы также пройдете через свойства прототипа, и в большинстве случаев это не то, что вам нужно. Вот почему вы должны проверить свойство с hasOwnProperty:

for (var i in keypairs) {
    if(keypairs.hasOwnProperty(i) {
        //...
    }
}
for (var i in keypairs) {
   if (keypairs.hasOwnProperty(i)) {
       ...
   }
}

Это потому что for/in цикл может перебирать какой-либо метод, расширенный сторонней библиотекой, например, если есть

Object.prototype.clone = function() { ... }

тогда без .hasOwnProperty() состояние, .clone Метод будет повторяться в ... также.

Это дополнительно объясняется в http://yuiblog.com/blog/2006/09/26/for-in-intrigue/, связанном с самой страницей JSLint.

Вы можете отключить это предупреждение, установив флажок "Допускать нефильтрованный вход".

Взгляните на собственную документацию jslint: http://www.jslint.com/lint.html перейдите к разделу

для в

они делают следующее:for (name in object) { if (object.hasOwnProperty(name)) { .... } }

Другие вопросы по тегам