NodeList agora tem forEach () em todos os principais navegadores
Consulte nodeList forEach () em MDN .
Resposta original
Nenhuma dessas respostas explica por que NodeList não herda de Array, permitindo que ele tenha forEach
e todo o resto.
A resposta é encontrada neste tópico es-discuss . Resumindo, ele quebra a web:
O problema era o código que assumia incorretamente que instanceof significava que a instância era um Array em combinação com Array.prototype.concat.
Havia um bug no Closure Library do Google que fazia com que quase todos os aplicativos do Google falhassem devido a isso. A biblioteca foi atualizada assim que foi encontrada, mas ainda pode haver código por aí que faz a mesma suposição incorreta em combinação com concat.
Ou seja, algum código fez algo como
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
No entanto, concat
tratará arrays "reais" (não instância de Array) de maneira diferente de outros objetos:
[1, 2, 3].concat([4, 5, 6]) // [1, 2, 3, 4, 5, 6]
[1, 2, 3].concat(4) // [1, 2, 3, 4]
então isso significa que o código acima quebrou quando x
era um NodeList, porque antes ele desceu o doSomethingElseWith(x)
caminho, enquanto depois ele desceu o otherArray.concat(x)
caminho, o que fez algo estranho, já que x
não era um array real.
Há algum tempo surgiu a proposta de uma Elements
classe que fosse uma verdadeira subclasse de Array, e seria usada como "a nova NodeList". No entanto, isso foi removido do padrão DOM , pelo menos por enquanto, uma vez que ainda não era viável de implementar por uma variedade de razões técnicas e de especificação.