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
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.
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.
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) {
//...
}
}
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".
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)) { .... } }