NodeList ahora tiene forEach () en todos los navegadores principales
Consulte nodeList forEach () en MDN .
Respuesta original
Ninguna de estas respuestas explica por qué NodeList no hereda de Array, lo que le permite tener forEach
y todo lo demás.
La respuesta se encuentra en este hilo es-discusion . En resumen, rompe la web:
El problema era el código que asumía incorrectamente que instanceof significaba que la instancia era un Array en combinación con Array.prototype.concat.
Hubo un error en la biblioteca de cierre de Google que causó que casi todas las aplicaciones de Google fallaran debido a esto. La biblioteca se actualizó tan pronto como se encontró esto, pero es posible que todavía haya código que haga la misma suposición incorrecta en combinación con concat.
Es decir, algún código hizo algo como
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
Sin embargo, concat
tratará las matrices "reales" (no la instancia de Array) de manera diferente a otros objetos:
[1, 2, 3].concat([4, 5, 6])
[1, 2, 3].concat(4)
lo que significa que el código anterior se rompió cuando x
era una NodeList, porque antes iba por el doSomethingElseWith(x)
camino, mientras que después seguía por el otherArray.concat(x)
camino, lo que hizo algo extraño ya que x
no era una matriz real.
Durante algún tiempo hubo una propuesta para una Elements
clase que era una subclase real de Array, y se usaría como "la nueva NodeList". Sin embargo, eso se eliminó del estándar DOM , al menos por ahora, ya que aún no era factible de implementar por una variedad de razones técnicas y relacionadas con las especificaciones.