NodeList тепер має forEach () у всіх основних браузерах
Див. NodeList forEach () на MDN .
Оригінальна відповідь
Жодна з цих відповідей не пояснює, чому NodeList не успадковує від Array, тим самим дозволяючи йому мати forEach
та все інше.
Відповідь можна знайти в цій темі для обговорення . Коротше кажучи, це ламає мережу:
Проблема полягала в коді, який неправильно припускав instanceof, що означає, що екземпляр був Array у поєднанні з Array.prototype.concat.
У бібліотеці закриття Google виникла помилка, яка спричинила збій майже всіх програм Google через це. Бібліотека була оновлена, як тільки це було знайдено, але все ще може бути код, який робить те саме неправильне припущення в поєднанні з concat.
Тобто якийсь код робив щось подібне
if (x instanceof Array) {
otherArray.concat(x);
} else {
doSomethingElseWith(x);
}
Однак ми concat
будемо обробляти "реальні" масиви (не екземпляри масиву) інакше, ніж інші об'єкти:
[1, 2, 3].concat([4, 5, 6])
[1, 2, 3].concat(4)
це означає, що вищезазначений код зламався, коли x
був NodeList, тому що до того, як він пішов по doSomethingElseWith(x)
шляху, тоді як він пішов по otherArray.concat(x)
шляху, що зробило щось дивне, оскільки x
це не був справжній масив.
Деякий час існувала пропозиція щодо Elements
класу, який був справжнім підкласом Array і використовувався як "новий NodeList". Однак це було вилучено зі стандарту DOM , принаймні на даний час, оскільки це ще було неможливо здійснити з різних технічних причин та специфікацій.