NodeList ma teraz forEach () we wszystkich głównych przeglądarkach
Zobacz nodeList forEach () w MDN .
Oryginalna odpowiedź
Żadna z tych odpowiedzi nie wyjaśnia, dlaczego NodeList nie dziedziczy po tablicy, co pozwala jej mieć forEach
i całą resztę.
Odpowiedź znajduje się w tym wątku es-dyskusji . Krótko mówiąc, łamie sieć:
Problemem był kod, który niepoprawnie zakładał, że instanceof oznacza, że instancja była Array w połączeniu z Array.prototype.concat.
Wystąpił błąd w bibliotece zamknięć Google, który spowodował, że prawie wszystkie aplikacje Google przestały działać z tego powodu. Biblioteka została zaktualizowana, gdy tylko została znaleziona, ale nadal może istnieć kod, który w połączeniu z concat przyjmuje takie same nieprawidłowe założenie.
Oznacza to, że jakiś kod zrobił coś podobnego
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
Jednak concat
„prawdziwe” tablice (nie instancje Array) będą traktować inaczej niż inne obiekty:
[1, 2, 3].concat([4, 5, 6])
[1, 2, 3].concat(4)
oznacza to, że powyższy kod zepsuł się, gdy x
był NodeList, ponieważ wcześniej poszedł w dół doSomethingElseWith(x)
ścieżki, podczas gdy później poszedł w dół otherArray.concat(x)
ścieżki, co zrobiło coś dziwnego, ponieważ x
nie był prawdziwą tablicą.
Przez pewien czas istniała propozycja Elements
klasy, która byłaby prawdziwą podklasą Array i miałaby służyć jako „nowa lista NodeList”. Jednak zostało to usunięte ze standardu DOM , przynajmniej na razie, ponieważ nie było to jeszcze możliwe do zaimplementowania z różnych powodów technicznych i specyfikacji.