Почему JavaScript не преобразует объекты, похожие на массивы, в массивы? - PullRequest
0 голосов
/ 11 ноября 2018

При изучении манипуляций с DOM я заметил, что методы Document, такие как getElementByTagName или querySelectorAll, возвращают объекты HTMLCollection или NodeList, которые, как бы они ни выглядели как массивы, должны быть преобразованы в массивы с помощью Arrays.from (), если мы хотим, чтобы эти коллекции есть очень полезные методы массива. Мне интересно, почему это так. Есть ли какая-то особая причина, по которой JS автоматически не конвертирует эти коллекции в массивы?

Редактировать: мое внимание привлекло, что NodeList имеет forEach () во всех основных браузерах.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

Коллекции DOM имеют свои собственные типы, а не являются экземплярами Array (или, по крайней мере, подкласса массива), поскольку они очень отличаются от массивов.Это просто представления в DOM, они не являются контейнерами, хранящими сами элементы.Они являются неизменяемыми (то есть вы не можете .push() на них) или даже живыми представлениями (т.е. они всегда представляют выбор в текущем состоянии документа).Также они могут содержать только узлы DOM, вы не можете помещать в них произвольные значения, как если бы вы вставляли их в массивы.

Конечно, они похожи на массивы в том смысле, что у них есть индексированные свойства и .length, но именно здесьсходство заканчивается.Обратите внимание, что только JavaScript позволяет вам получать доступ к содержимому с индексными свойствами, в соответствии с DOM, не зависящим от языка, вы бы использовали метод .item(index).Именно поэтому коллекции DOM имеют свою собственную иерархию и не имеют ничего общего с типом Array, встроенным в JavaScript.

0 голосов
/ 11 ноября 2018

Вы хотите, чтобы подобные объекту DOM объекты были неявно преобразованы в массивы. Javascript является очень динамическим языком и выполняет много таких преобразований автоматически. И это одна из причин, по которой этот язык так ненавидят в сообществе. Например: 1 == "1" возвращает true в Javascript.

Итак, проблема, которую вы поставили, - это старая проблема определения, где мы должны провести черту.

Как вы сами отметили, все, что вам нужно сделать, это вызвать Arrays.from, чтобы получить реальный массив.

...