Nivel inicial4 min de lectura · Publicado el

Comportamiento de un array en JavaScript: huecos

Array en JavaScript con huecos: tras arr[9] = 6, la fila de taquillas llega a 10 y de la 4 a la 8 quedan cinco vacías. arr[9] = 6 deja cinco huecosrubentejera.com 011223344567896<5 empty items>arr[9] = 6;arr.length → 10
Como una fila de taquillas numeradas: las de la 0 a la 3 guardan 1, 2, 3 y 4. Al guardar 6 en la 9, la fila llega a 10, pero de la 4 a la 8 no hay nada: son huecos, no undefined.

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