Tout d'abord, ne jamais utiliser un for in
boucle pour énumérer sur un tableau. Jamais. Utiliser les bonnes vieilles for(var i = 0; i<arr.length; i++)
.
La raison derrière cela est le suivant: chaque objet en JavaScript a un champ spécial appelé prototype
. Tout ce que vous ajoutez à ce champ va être accessible sur tous les objets de ce type. Supposons que vous voulez tous les tableaux d'avoir un cool nouvelle fonction appelée filter_0
filtre les zéros.
Array.prototype.filter_0 = function() {
var res = [];
for (var i = 0; i < this.length; i++) {
if (this[i] != 0) {
res.push(this[i]);
}
}
return res;
};
console.log([0, 5, 0, 3, 0, 1, 0].filter_0());
//prints [5,3,1]
C'est un moyen d'étendre les objets et ajouter de nouvelles méthodes. Beaucoup de bibliothèques de le faire.
Cependant, regardons comment for in
travaille maintenant:
var listeners = ["a", "b", "c"];
for (o in listeners) {
console.log(o);
}
//prints:
// 0
// 1
// 2
// filter_0
Voyez-vous? Soudain, elle pense filter_0 est un autre indice de tableau. Bien sûr, il n'est pas vraiment un indice numérique, mais for in
énumère les champs objet, pas seulement des indices numériques. Nous sommes donc maintenant énumération dans tous les index numérique et filter_0
. Mais filter_0
n'est pas un champ d'un tableau d'objets, chaque objet array a cette propriété.
Heureusement, tous les objets ont un hasOwnProperty
méthode, qui vérifie si ce champ appartient vraiment à l'objet lui-même ou si elle est simplement hérité de la chaîne de prototype et appartient donc à tous les objets de ce type.
for (o in listeners) {
if (listeners.hasOwnProperty(o)) {
console.log(o);
}
}
//prints:
// 0
// 1
// 2
Note que, même si ce code fonctionne comme prévu pour les tableaux, vous ne devriez jamais, jamais, utilisez for in
et for each in
pour les tableaux. Rappelez-vous que for in
énumère les champs d'un objet, pas de tableau d'index ou de valeurs.
var listeners = ["a", "b", "c"];
listeners.happy = "Happy debugging";
for (o in listeners) {
if (listeners.hasOwnProperty(o)) {
console.log(o);
}
}
//prints:
// 0
// 1
// 2
// happy