Типы псевдомассивов в JavaScript

Пусть у нас есть следующий HTML код:

<div> <p></p> <p></p> <p></p> </div>

Получим ссылку на див в переменную:

let div = document.querySelector('div');

Давайте теперь получим псевдомассив наших абзацев. Здесь, однако, есть нюанс - в зависимости от способа получения мы можем получить псевдомассивы различных типов.

К примеру, через querySelectorAll мы получим коллекцию NodeList:

let elems = document.querySelectorAll('p'); console.log(elems); // NodeList

А через getElementsByTagName мы получим коллекцию HTMLCollection:

let elems = document.getElementsByTagName('p'); console.log(elems); // HTMLCollection

Разница между двумя типами псевдомассивов в различном поведении при изменении DOM элементов. Пусть, к примеру, мы получили коллекцию абзацев в виде HTMLCollection и в виде NodeList. Затем мы создадим и добавим еще один абзац в наш DOM. В этом случае он автоматически появится в HTMLCollection, но коллекция NodeList останется без изменений.

Смотрите пример:

let elems1 = document.querySelectorAll('p'); // NodeList let elems2 = document.getElementsByTagName('p'); // HTMLCollection let p = document.createElement('p'); div.append(p); console.log(elems1); // 3 начальных абзаца console.log(elems2); // 4 абзаца - с новым

Проверьте, какой тип коллекции будет в свойстве childNodes и в свойстве children.