JavaScript: JSLint erreur “Le corps d'un pour dans doit être enveloppé dans une instruction if pour filtrer les indésirables propriétés du prototype”
Je suis en utilisant le JSLint outil pour assurer mon JavaScript est "strict".
Je reçois l'erreur suivante mais ne comprends pas comment le résoudre:
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) {
...
}
Quelqu'un a une idée de comment résoudre ce problème pour que c'est JavaScript "stricte" et de ne pas être marqué par JSLint
Vous devez vous connecter pour publier un commentaire.
Si
keypairs
est un tableau, alors vous devriez vraiment faire une itération sur les éléments comme:Si
keypairs
est une table de hachage, puis JSLint est correctement recommandant que vous vérifiez que vous êtes d'exploitation sur le type de clé (c'est à dire, confirmant que le hachage est le type attendu)donc quelque chose comme
où le si est la validation des critères qui s'assure que vous n'êtes pas accès à un prototype de fonction, etc.
for (var i = 0, l = keypairs.length; i < l; ++i) { ... }
. C'est légèrement plus rapide en raison de moins de recherche généraux pour la variable locale (par rapport à la longueur de la propriété). C'est aussi ce que CoffeeScript permettrait de générer :-).Il veut que vous utilisez
hasOwnProperty
.Comme beaucoup de JSLint, c'est une recommandation, et son applicabilité dépend de votre situation. Il est utile si il y a des indésirables énumérable propriétés de l'objet prototype. Cela peut être le cas, par exemple si vous utilisez certaines bibliothèques JavaScript.
Le problème avec
for...in
est que vous pourrez également parcourir les propriétés du prototype et la plupart du temps ce n'est pas ce que vous voulez. C'est pourquoi vous devez tester la propriété avechasOwnProperty
:C'est parce que le
for
/in
boucle peut itérer sur une méthode étendue par le 3e partie de la bibliothèque, par exemple si il y a unsans le
.hasOwnProperty()
condition, la.clone
méthode sera réitéré dans le...
ainsi.Cela est expliqué plus en détail dans http://yuiblog.com/blog/2006/09/26/for-in-intrigue/ à partir de la JSLint page elle-même.
Vous pouvez désactiver cet avertissement en cochant "Tolérer non filtré à l'".
prendre un coup d'oeil à jslint la documentation propre:
http://www.jslint.com/lint.html
sauter à la section
pour en
ils ne les suivants:
for (name in object) { if (object.hasOwnProperty(name)) { .... } }