NodeList a maintenant forEach () dans tous les principaux navigateurs
Voir nodeList forEach () sur MDN .
Réponse originale
Aucune de ces réponses n'explique pourquoi NodeList n'hérite pas de Array, ce qui lui permet d'avoir forEach
et tout le reste.
La réponse se trouve sur ce fil de discussion es-discuter . Bref, ça casse le web:
Le problème était un code qui supposait à tort que instanceof signifiait que l'instance était un tableau en combinaison avec Array.prototype.concat.
Il y avait un bogue dans la bibliothèque de fermeture de Google qui a causé l'échec de presque toutes les applications de Google à cause de cela. La bibliothèque a été mise à jour dès que cela a été trouvé, mais il peut encore y avoir du code là-bas qui fait la même hypothèse incorrecte en combinaison avec concat.
Autrement dit, un code a fait quelque chose comme
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
Cependant, concat
traitera les tableaux "réels" (et non les instances de Array) différemment des autres objets:
[1, 2, 3].concat([4, 5, 6]) // [1, 2, 3, 4, 5, 6]
[1, 2, 3].concat(4) // [1, 2, 3, 4]
donc cela signifie que le code ci-dessus s'est cassé quand x
était une NodeList, car avant de descendre dans le doSomethingElseWith(x)
chemin, alors qu'après, il a otherArray.concat(x)
emprunté le chemin, ce qui a fait quelque chose de bizarre puisque ce x
n'était pas un vrai tableau.
Pendant un certain temps, il y avait une proposition pour une Elements
classe qui était une vraie sous-classe d'Array, et serait utilisée comme "la nouvelle NodeList". Cependant, cela a été supprimé du standard DOM , du moins pour le moment, car il n'était pas encore possible de l'implémenter pour diverses raisons techniques et liées aux spécifications.