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