← Estructuras de datos desde cero · Lección 2/32
Valores y referencias
Los valores sencillos se copian
Los números, los textos y los booleanos (true/false) son valores primitivos. Cuando escribes b = a, b recibe una copia: cambiar b después no toca a a.
$ node leccion.js
Pulsa CORRER (o Ctrl+Enter).
Qué mirar
a sigue en 5 y saludo sigue en «hola»: cada variable tiene su propio valor.
Toda la lección en una página
Los valores sencillos se copian
Los números, los textos y los booleanos (true/false) son valores primitivos. Cuando escribes b = a, b recibe una copia: cambiar b después no toca a a.
let a = 5;
let b = a;
b = 8;
console.log(a, b);
let saludo = "hola";
let otro = saludo;
otro = otro + " Sahuayo";
console.log(saludo, "|", otro);
a sigue en 5 y saludo sigue en «hola»: cada variable tiene su propio valor.
Los objetos se comparten
Con los arreglos y los objetos pasa otra cosa. La variable no guarda el arreglo: guarda dónde está (una referencia, como la dirección de una casa). b = a copia la dirección, no la casa. Los dos apuntan al mismo arreglo, así que lo que le hagas por b se ve por a.
Esto es lo más importante de la unidad: las listas enlazadas, los árboles y los grafos están hechos de objetos que se apuntan unos a otros con referencias.
const a = [1, 2, 3];
const b = a; // la misma dirección
b.push(4);
console.log(a);
const ficha = { nombre: "Rosa", puntos: 10 };
const misma = ficha;
misma.puntos = 99;
console.log(ficha.puntos);
a también tiene el 4, y la ficha original quedó con 99 puntos. Nunca hubo dos arreglos ni dos fichas: hubo dos nombres para la misma cosa.
Copiar de verdad, y comparar
Si quieres otro arreglo, hay que crearlo. [...a] hace uno nuevo con los mismos elementos (una copia superficial: si adentro hay objetos, esos se siguen compartiendo). structuredClone(a) copia todo, hasta el fondo.
Y ojo con ===: con objetos compara direcciones, no contenido. Dos arreglos iguales por dentro no son «el mismo» arreglo.
const a = [1, 2];
const b = [...a];
b.push(3);
console.log(a, b);
console.log([1, 2] === [1, 2]);
console.log(a === a);
const grupos = [["Ana"], ["Beto"]];
const superficial = [...grupos];
superficial[0].push("Caro");
console.log(grupos[0]);
ase quedó en[1, 2]: ahora sí son dos arreglos.[1, 2] === [1, 2]esfalse: son dos direcciones distintas.- El último caso es la trampa de la copia superficial: el arreglo de afuera es nuevo, pero
["Ana"]se compartió y ganó a «Caro».