web-dev-qa-db-fra.com

JavaScript: erreur JSLint "Le corps du for in doit être encapsulé dans une instruction if pour filtrer les propriétés indésirables du prototype"

J'utilise l'outilJSLintpour m'assurer que mon JavaScript est "strict".

Je reçois l'erreur suivante mais je ne comprends pas comment résoudre ce problème:

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

Pour le code suivant:

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

N'importe qui a une idée sur la façon de résoudre ce problème en disant qu'il est JavaScript "strict" et qu'il ne sera pas signalé par JSLint

28
HeatherK

Si keypairs est un tableau, alors vous devriez vraiment parcourir les éléments tels que:

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

Si keypairs est un hachage, JSLint vous recommande correctement de vérifier que vous utilisez le type de clé approprié (c'est-à-dire que le hachage correspond au type attendu).

donc quelque chose comme

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

où le fait de valider quelque critère que ce soit garantit que vous n'accédez pas à une fonction prototype, etc.

39
Chris Baxter

Il veut que vous utilisiez hasOwnProperty.

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

Comme beaucoup de JSLint, il s'agit d'une recommandation et son applicabilité dépend de votre situation. C'est utile s'il y a des propriétés enumerable non désirées dans le prototype de l'objet. Cela pourrait être le cas si, par exemple, vous utiliser certaines bibliothèques JavaScript.

16
Matthew Flaschen

Le problème avec for...in est que vous allez également parcourir les propriétés du prototype et que la plupart du temps, ce n'est pas ce que vous voulez. C'est pourquoi vous devriez tester la propriété avec hasOwnProperty :

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

Cela est dû au fait que la boucle for/in peut itérer sur une méthode étendue par une bibliothèque tierce, par exemple. s'il y a un

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

puis sans la condition .hasOwnProperty(), la méthode .clone sera également itérée dans le ....

Ceci est expliqué plus en détail dans http://yuiblog.com/blog/2006/09/26/for-in-intrigue/ , à partir de la page JSLint elle-même.

Vous pouvez désactiver cet avertissement en cochant la case "Tolérer non filtré dans".

3
kennytm

jetez un coup d'œil à la documentation de jslint: http://www.jslint.com/lint.html Passez à la section suivante

pour dans

ils font ce qui suit: for (name in object) { if (object.hasOwnProperty(name)) { .... } }

0
ds111