NodeList ora ha forEach () in tutti i principali browser
Vedi nodeList forEach () su MDN .
Risposta originale
Nessuna di queste risposte spiega perché NodeList non eredita da Array, permettendogli così di avere forEach
e tutto il resto.
La risposta si trova in questo thread di es-discuss . In breve, rompe il web:
Il problema era il codice che presumeva erroneamente che instanceof significasse che l'istanza era un array in combinazione con Array.prototype.concat.
C'era un bug nella libreria di chiusura di Google che causava il fallimento di quasi tutte le app di Google a causa di ciò. La libreria è stata aggiornata non appena è stata trovata, ma potrebbe esserci ancora del codice là fuori che fa lo stesso presupposto errato in combinazione con concat.
Cioè, un codice ha fatto qualcosa di simile
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
Tuttavia, concat
tratterà gli array "reali" (non l'istanza di Array) in modo diverso dagli altri oggetti:
[1, 2, 3].concat([4, 5, 6]) // [1, 2, 3, 4, 5, 6]
[1, 2, 3].concat(4) // [1, 2, 3, 4]
quindi questo significa che il codice sopra si è rotto quando x
era un NodeList, perché prima è andato lungo il doSomethingElseWith(x)
percorso, mentre in seguito è andato lungo il otherArray.concat(x)
percorso, il che ha fatto qualcosa di strano poiché x
non era un vero array.
Da tempo è stata proposta una Elements
classe che fosse una vera e propria sottoclasse di Array, e che sarebbe stata usata come "la nuova NodeList". Tuttavia, questo è stato rimosso dallo standard DOM , almeno per ora, poiché non era ancora possibile implementarlo per una serie di motivi tecnici e relativi alle specifiche.