JavaScript: ошибка JSLint «Тело for in должно быть заключено в оператор if для фильтрации нежелательных свойств из прототипа» - PullRequest
30 голосов
/ 12 ноября 2010

Я использую инструмент 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 ]

40 голосов
/ 12 ноября 2010

Если keypairs является массивом, то вам действительно нужно выполнить итерации по таким элементам, как:

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

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

, что-то вроде

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

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

16 голосов
/ 12 ноября 2010

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

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

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

5 голосов
/ 12 ноября 2010

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

for (var i in keypairs) {
    if(keypairs.hasOwnProperty(i) {
        //...
    }
}
3 голосов
/ 12 ноября 2010
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.

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

0 голосов
/ 09 ноября 2012

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

для в

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

...