Command Palette

Search for a command to run...

NodeList vs HTMLCollection: Colecciones Vivas y Estáticas

Aprende las diferencias entre NodeList y HTMLCollection, sus características, y cuándo usar cada una para manipular múltiples elementos del DOM.

Lectura: 12 min
Nivel: Principiante

TL;DR - Resumen rápido

  • HTMLCollection es viva y se actualiza automáticamente cuando cambia el DOM
  • NodeList puede ser viva o estática según el método que la crea
  • HTMLCollection no tiene forEach, NodeList de querySelectorAll sí lo tiene
  • Convierte HTMLCollection a Array para usar métodos como map y filter
  • Usa NodeList estática cuando planeas modificar el DOM durante iteración

Introducción a Colecciones del DOM

Cuando seleccionas múltiples elementos del DOM con métodos comogetElementsByClassName, getElementsByTagName oquerySelectorAll, recibes colecciones de elementos en lugar de elementos individuales. Las dos principales colecciones son HTMLCollectiony NodeList, y entender sus diferencias es fundamental.

Aunque parecen similares, estas colecciones tienen comportamientos muy diferentes que pueden afectar significativamente tu código. La distinción más importante es que una es viva (se actualiza automáticamente) y la otra puede ser estática (no cambia después de creada).

¿Por qué hay dos tipos de colecciones?

Las colecciones diferentes existen por razones históricas y de rendimiento.HTMLCollection es más antigua y está optimizada para actualizaciones automáticas, mientras que NodeList es más moderna y puede ser estática para mejor rendimiento en ciertos casos.

HTMLCollection

HTMLCollection es una colección viva de elementos HTML. Esto significa que la colección se actualiza automáticamente cuando añades o eliminas elementos del DOM que coinciden con los criterios de selección originales.

Características de HTMLCollection

HTMLCollection tiene varias características importantes que debes conocer para usarla correctamente. Es retornada por métodos comogetElementsByClassName y getElementsByTagName.

htmlcollection-caracteristicas.js
Loading code...

Este ejemplo muestra las características de HTMLCollection. Observa que la colección se actualiza automáticamente cuando añades nuevos elementos al DOM. También nota que HTMLCollection no tiene el método forEach.

  • <strong>Es viva</strong>: Se actualiza automáticamente cuando cambia el DOM
  • <strong>No tiene forEach</strong>: Necesitas convertirla a Array para iterar
  • <strong>Propiedad length</strong>: Retorna el número de elementos en la colección
  • <strong>Acceso por índice</strong>: Puedes acceder con collection[i]
  • <strong>Item con nombre</strong>: Puedes usar collection.namedItem('id')

Métodos de HTMLCollection

HTMLCollection tiene métodos limitados pero útiles. Los más importantes son item() para acceder a elementos ynamedItem() para buscar elementos por su nombre o ID.

htmlcollection-metodos.js
Loading code...

Este ejemplo muestra los métodos principales de HTMLCollection. El método namedItem() es especialmente útil para buscar elementos por su atributo name o id.

Limitaciones de HTMLCollection

HTMLCollection no tiene métodos de Array como map,filter o reduce. Necesitas convertirla a Array usando Array.from() o el spread operator antes de usar estos métodos.

NodeList

NodeList puede ser viva o estática, dependiendo del método que la crea. Las NodeList retornadas porchildNodes o querySelectorAll tienen comportamientos diferentes que debes entender.

NodeList Estática

La NodeList retornada por querySelectorAll es estática, lo que significa que no cambia después de creada, incluso si el DOM se modifica. Esto es importante cuando planeas iterar y modificar elementos.

nodelist-estatica.js
Loading code...

Este ejemplo muestra que la NodeList dequerySelectorAll es estática. Aunque añades nuevos elementos al DOM, la colección original no se actualiza. Esto es útil cuando necesitas iterar y modificar el DOM de forma segura.

Ventaja de NodeList estática

La NodeList estática es más segura cuando iteras y modificas el DOM, porque la colección no cambia mientras la iteras. Esto evita bugs inesperados causados por colecciones vivas que se actualizan durante la iteración.

NodeList Viva

La NodeList retornada por propiedades como childNodeses viva, similar a HTMLCollection. Se actualiza automáticamente cuando el DOM cambia, lo cual puede causar comportamiento inesperado durante iteraciones.

nodelist-viva.js
Loading code...

Este ejemplo muestra que la NodeList de childNodeses viva. Observa cómo la longitud de la colección cambia cuando eliminas elementos del DOM.

Diferencias Clave

Entender las diferencias clave entre HTMLCollection yNodeList te ayudará a elegir la correcta para cada situación. Aquí compararemos las características más importantes de ambas colecciones.

diferencias-clave.js
Loading code...

Esta comparación muestra las diferencias principales entre ambas colecciones. La distinción más importante es que HTMLCollection siempre es viva, mientras que NodeList puede ser viva o estática.

  • <strong>HTMLCollection</strong>: Solo contiene elementos (Element nodes)
  • <strong>NodeList</strong>: Puede contener cualquier tipo de nodo
  • <strong>HTMLCollection</strong>: Siempre es viva
  • <strong>NodeList</strong>: Puede ser viva o estática
  • <strong>HTMLCollection</strong>: No tiene forEach en navegadores modernos
  • <strong>NodeList</strong>: Tiene forEach en navegadores modernos

Cuándo Usar Cada Una

Elegir entre HTMLCollection y NodeList depende de tu caso de uso específico. Cada una tiene sus propias ventajas y desventajas que debes considerar antes de decidir cuál usar.

Cuándo Usar HTMLCollection

HTMLCollection es ideal cuando necesitas que la colección se actualice automáticamente o cuando buscas por clase o etiqueta específica. Es más rápida para estas búsquedas simples.

cuando-htmlcollection.js
Loading code...

Este ejemplo muestra cuándo usar HTMLCollection. Es ideal para búsquedas por clase o etiqueta donde necesitas que la colección se actualice automáticamente.

Cuándo Usar NodeList

NodeList es ideal cuando necesitas iterar y modificar el DOM de forma segura, o cuando necesitas usar selectores CSS complejos. La versión estática de querySelectorAll es especialmente útil.

cuando-nodelist.js
Loading code...

Este ejemplo muestra cuándo usar NodeList. Es ideal cuando necesitas iterar y modificar el DOM de forma segura usando selectores CSS complejos.

Recomendación general

Para la mayoría de casos, usa querySelectorAll que retorna unaNodeList estática con forEach. Es más flexible y segura que HTMLCollection, especialmente cuando planeas modificar el DOM.

Errores Comunes

Al trabajar con colecciones del DOM, hay varios errores que los desarrolladores cometen frecuentemente. Conocer estos errores te ayudará a evitarlos y escribir código más robusto.

Modificar Colección Viva

Un error común es modificar una colección viva mientras iteras sobre ella. Como la colección se actualiza automáticamente, los cambios afectan la iteración actual, lo cual puede causar comportamiento inesperado.

error-modificar-coleccion-viva.js
Loading code...

Este ejemplo muestra el error de modificar una colección viva durante la iteración. Convierte la colección a Array antes de iterar si planeas modificar el DOM.

Iteración segura

Si necesitas modificar el DOM mientras iteras sobre elementos, usaquerySelectorAll que retorna una NodeList estática, o convierte la colección viva a Array antes de iterar.

No Convertir a Array

Otro error común es intentar usar métodos de Array como map,filter o reduce directamente en unaHTMLCollection. Estos métodos no existen en esta colección.

error-no-convertir-array.js
Loading code...

Este ejemplo muestra el error de no convertir a Array y cómo solucionarlo. Convierte la colección a Array usando Array.from() o el spread operator para acceder a todos los métodos de Array.

Resumen: NodeList vs HTMLCollection

Conceptos principales:

  • HTMLCollection es viva y se actualiza automáticamente cuando cambia el DOM
  • NodeList puede ser viva (childNodes) o estática (querySelectorAll)
  • HTMLCollection no tiene forEach, NodeList de querySelectorAll sí lo tiene
  • Convierte HTMLCollection a Array para usar métodos como map y filter
  • NodeList estática es más segura cuando iteras y modificas el DOM

Mejores prácticas:

  • Usa querySelectorAll para NodeList estática con forEach integrado
  • Convierte HTMLCollection a Array antes de iterar si planeas modificar el DOM
  • Usa HTMLCollection para búsquedas rápidas por clase o etiqueta
  • Usa NodeList estática cuando necesitas iterar y modificar elementos
  • Siempre verifica el tipo de colección antes de usar métodos específicos