Regístrate para acceder a más de 15 cursos gratuitos de programación con un simulador

Enlaces JS: Arrays

Cuando guardamos información en una variable en JavaScript, esta puede ser de dos tipos: datos primitivos y datos de referencia. Entender la diferencia entre ellos es clave porque afecta la forma en que se modifican y se pasan entre funciones.

Tipos primitivos

Los tipos de datos primitivos incluyen:

Tipo de Dato Ejemplo
Números 1, 3.14, -100
Cadenas de texto (strings) 'Hola', "JavaScript"
Booleanos true, false
null Ausencia de valor
undefined Valor no asignado explícitamente
Symbol y BigInt Usados en casos más avanzados

Las variables que almacenan un valor primitivo contienen directamente el valor en sí. Por ejemplo:

let mensaje = 'Hola';
let copia = mensaje;

copia = 'Adiós';

console.log(mensaje); // 'Hola'
console.log(copia);   // 'Adiós'

Aquí, cambiar copia no afecta a mensaje porque son valores separados.


Tipos de referencia

Los tipos de referencia incluyen:

Tipo de Dato Ejemplo
Arrays ([]) [1, 2, 3], ['a', 'b', 'c']
Objetos ({}) { nombre: 'Juan', edad: 30 }, { color: 'rojo', forma: 'cuadrado' }
Funciones function saludar() { console.log('Hola'); }, const suma = (a, b) => a + b;

Cuando asignamos un tipo de referencia a una variable, en realidad estamos almacenando una referencia a ese valor en memoria, no el valor en sí. Eso significa que si dos variables apuntan al mismo array u objeto, modificar una afectará también a la otra.

Veamos un ejemplo con un array:

const items = [1, 2];
// Ambas constantes apuntan al mismo array en memoria
const items2 = items;

items2.push(3);

console.log(items);  // [1, 2, 3]
console.log(items2); // [1, 2, 3]
console.log(items === items2); // true

Aquí, items e items2 son referencias al mismo array en la memoria. Cuando modificamos items2, también cambiamos items, porque ambos apuntan a la misma ubicación.


Comparación de arrays

Al comparar arrays con ===, estamos comparando referencias, NO el contenido:

console.log([1, 2, 3] === [1, 2, 3]); // false

Cada array se guarda en una ubicación diferente de la memoria, por lo que aunque tengan el mismo contenido, no son el mismo array.


Paso de referencias a funciones

Cuando pasamos un array a una función, lo que realmente se pasa es la referencia, no una copia del array:

const agregarElemento = (arr) => arr.push('wow');

const items = ['uno'];
agregarElemento(items);
console.log(items); // ['uno', 'wow']
agregarElemento(items);
console.log(items); // ['uno', 'wow', 'wow']

La función agregarElemento modificó directamente el array original porque está trabajando con la referencia.


Diseño de funciones: ¿modificar o no modificar?

Cuando se trabajan con arrays dentro de funciones, hay dos opciones:

  • Modificar el array original
  • Crear un nuevo array y devolverlo

Por lo general, es mejor la segunda opción. Así evitamos efectos inesperados y facilitamos la depuración del código.

Por ejemplo, veamos una función last(), que obtiene el último elemento de un array. Una mala implementación sería esta:

const last = (coll) => coll.pop();

❌ El problema aquí es que la función no solo obtiene el último elemento, sino que también lo elimina. Esto puede ser inesperado.

La forma correcta de hacerlo sin modificar el array es:

const last = (coll) => coll.at(-1);

const numeros = [10, 20, 30];
console.log(last(numeros)); // 30
console.log(numeros); // [10, 20, 30] (sin cambios)

El método .at(-1) devuelve el último elemento sin modificar el array.


Modificación de arrays por rendimiento

A veces queremos que una función modifique el array original, especialmente cuando el rendimiento es una preocupación. Hacer una copia de un array grande puede ser costoso en términos de memoria y velocidad.

Algunos métodos incorporados en JavaScript ya operan directamente sobre el array original, como:

const items = [3, 8, 1];

items.sort(); // Ordena el array permanentemente
console.log(items); // [1, 3, 8]

items.reverse(); // Invierte el array original
console.log(items); // [8, 3, 1]

Por otro lado, hay métodos como .concat(), que devuelven un nuevo array sin modificar el original. Siempre es importante leer la documentación para saber si un método modifica el array o no.


Resumen

  • Los tipos primitivos (números, strings, booleanos, etc.) se almacenan directamente en variables.
  • Los tipos de referencia (arrays, objetos, funciones) almacenan una referencia a la memoria, no el valor en sí.
  • Modificar un array en una variable afecta a todas las variables que referencian el mismo array.
  • Comparar arrays con === compara referencias, no contenido.
  • Pasar un array a una función pasa su referencia, lo que permite modificar el array dentro de la función.
  • Es recomendable evitar modificar arrays directamente dentro de funciones, a menos que el rendimiento sea una preocupación.
  • Algunos métodos de array como .sort() y .reverse() modifican el array original, mientras que otros como .concat() crean una copia.

Materiales adicionales

  1. El método concat() 📚 MDN Web Docs

Para acceder completo a curso necesitas un plan básico

El plan básico te dará acceso completo a todos los cursos, ejercicios y lecciones de Códica, proyectos y acceso de por vida a la teoría de las lecciones completadas. La suscripción se puede cancelar en cualquier momento.

Obtener acceso
130
cursos
1000
ejercicios
2000+
horas de teoría
3200
test

Obtén acceso

Cursos de programación para principiantes y desarrolladores experimentados. Comienza tu aprendizaje de forma gratuita

  • 130 cursos, 2000+ horas de teoría
  • 1000 ejercicios prácticos en el navegador
  • 360 000 estudiantes
Al enviar el formulario, aceptas el «Política de privacidad» y los términos de la «Oferta», y también aceptas los «Términos y condiciones de uso»

Nuestros graduados trabajan en empresas como:

Bookmate
Health Samurai
Dualboot
ABBYY