Ir al contenido
Ayotl

← Estructuras de datos desde cero · Lección 2/32

Valores y referencias

✕
1/8

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.

leccion.js

$ 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]);
  • a se quedó en [1, 2]: ahora sí son dos arreglos.
  • [1, 2] === [1, 2] es false: 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».