Comportamiento de un array en JavaScript: huecos
Un array es como una fila de taquillas numeradas. Si guardas algo en la 9 cuando solo usabas de la 0 a la 3, la fila crece hasta la 9, pero de la 4 a la 8 no hay nada: ni siquiera una caja vacía.
El comportamiento
const arr = [1, 2, 3, 4];
arr[9] = 6;
arr; // [1, 2, 3, 4, <5 empty items>, 6]
arr.length; // 10
arr[6]; // undefined
A un array con huecos se le llama sparse array (array disperso).
Un hueco no es undefined
Leer arr[6] devuelve undefined, pero la posición no existe. Se ve con el operador in, que pregunta si una posición existe:
6 in arr; // false: es un hueco
3 in arr; // true
La diferencia se nota al recorrer el array:
| Forma de recorrer | Qué hace con los huecos | Resultado con arr |
|---|---|---|
arr.forEach((v, i) => …) |
Se los salta | Visita los índices 0, 1, 2, 3 y 9 |
arr.map((x) => x * 2) |
Se los salta y los conserva | [2, 4, 6, 8, <5 empty items>, 12] |
for (const v of arr) |
Los trata como undefined |
1 2 3 4 undefined … 6 |
arr.includes(undefined) |
Los trata como undefined |
true |
arr.indexOf(undefined) |
Se los salta | -1 |
arr.filter(() => true) |
Se los salta y los quita | [1, 2, 3, 4, 6] |
JSON.stringify(arr) |
Los convierte en null |
[1,2,3,4,null,null,null,null,null,6] |
La sorpresa típica está en includes e indexOf: el primero dice que hay undefined y el segundo dice que no. Y ojo con JSON.stringify: si envías este array a un servidor, los huecos llegan como null.
Un truco que sale de la tabla: arr.filter(() => true) devuelve una copia del array sin huecos.
Otros casos que crean huecos
new Array(3); // [<3 empty items>]
[, 1]; // [<1 empty item>, 1]
const b = [1, 2, 3];
b.length = 1; // recorta: b es [1]
Si quieres un array de un tamaño fijo sin huecos, usa Array.from({ length: 3 }) (tres undefined reales) o new Array(3).fill(0).
Más métodos y lo que hace cada uno en métodos de arrays en JavaScript.
Fuentes
- MDN (consultado en noviembre de 2026): Array: arrays dispersos, Arrays dispersos (Indexed collections) y el operador in.
- Todos los ejemplos se han ejecutado con Node 24.21.0; la salida
<5 empty items>es la de Node (la consola de Chrome la muestra comoempty × 5).