Utilisez hasOwnProperty pour filtrer
Résumé
Comme l'opérateur in, la boucle for in parcourt également toutes les propriétés de la chaîne de prototypes lors de la recherche de propriétés d'objet.
// 修改 Object.prototype Object.prototype.bar = 1; var foo = {moo: 2}; for(var i in foo) { console.log(i); // 输出两个属性:bar 和 moo }
Comme il est impossible de modifier le comportement de for en soi, il est nécessaire de filtrer les propriétés qui ne veulent pas apparaître dans le corps de la boucle. Cela peut être fait via la fonction hasOwnProperty sur. le prototype Object.prototype.
Remarque : la boucle for in ne traversera pas les propriétés dont l'énumérable est défini sur false, comme la propriété length d'un tableau ;
Utilisez hasOwnProperty pour filtrer
// foo 变量是上例中的 for(var i in foo) { if (foo.hasOwnProperty(i)) { console.log(i); } }
Cette version du code est la seule façon correcte de l'écrire. Puisque nous avons utilisé hasOwnProperty, seul moo est affiché cette fois. Si hasOwnProperty n'est pas utilisé, ce code peut être interrompu lorsque les prototypes d'objets natifs (tels que Object.prototype) sont étendus.
Une bibliothèque de classes largement utilisée, Prototype, étend les objets JavaScript natifs. Par conséquent, lorsque cette bibliothèque de classes est incluse dans la page, les boucles for in qui n'utilisent pas le filtrage hasOwnProperty poseront inévitablement des problèmes.
Remarque : Puisque for in parcourt toujours toute la chaîne de prototypes, les performances seront affectées si le niveau d'héritage d'un objet est trop profond.
Résumé
Il est recommandé de toujours utiliser hasOwnProperty, de ne faire aucune hypothèse sur l'environnement dans lequel le code s'exécute et de ne pas supposer si l'objet natif a été étendu.
Ce qui précède est le contenu de la série JavaScript avancée - for in loop. Pour plus de contenu connexe, veuillez faire attention au site Web PHP chinois (www.php.cn) !