NodeList hat jetzt forEach () in allen gängigen Browsern
Siehe nodeList forEach () auf MDN .
Ursprüngliche Antwort
Keine dieser Antworten erklärt, warum NodeList nicht von Array erbt, sodass es forEachund alles andere möglich ist .
Die Antwort finden Sie in diesem Diskussions-Thread . Kurz gesagt, es bricht das Web:
Das Problem war Code, der fälschlicherweise angenommen hat, dass die Instanz ein Array in Kombination mit Array.prototype.concat ist.
Es gab einen Fehler in der Google Closure Library, der dazu führte, dass fast alle Google-Apps aufgrund dessen fehlschlugen. Die Bibliothek wurde aktualisiert, sobald dies gefunden wurde, aber es gibt möglicherweise noch Code, der dieselbe falsche Annahme in Kombination mit concat macht.
Das heißt, irgendein Code hat so etwas getan
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
Allerdings concatwird behandeln „echte“ Arrays (nicht Instanceof Array) unterschiedlich von anderen Objekten:
[1, 2, 3].concat([4, 5, 6]) // [1, 2, 3, 4, 5, 6]
[1, 2, 3].concat(4) // [1, 2, 3, 4]
Das bedeutet, dass der obige Code als xNodeList fehlerhaft war, weil er zuvor den doSomethingElseWith(x)Pfad entlang ging , während er danach den otherArray.concat(x)Pfad entlang ging , was etwas Seltsames tat, da xes sich nicht um ein echtes Array handelte.
Für einige Zeit gab es einen Vorschlag für eine ElementsKlasse, die eine echte Unterklasse von Array war und als "neue NodeList" verwendet werden sollte. Dies wurde jedoch zumindest vorerst aus dem DOM-Standard entfernt , da eine Implementierung aus verschiedenen technischen und spezifikationsbezogenen Gründen noch nicht möglich war.