Primitivos y objetos en JavaScript: valor y referencia | Nicolás Garzón🧩
Los primitivos y los objetos no solo guardan información diferente: también se copian, comparan y modifican de maneras distintas.
Cuando trabajas con un valor primitivo, la variable contiene ese valor simple.
Cuando trabajas con un objeto, la variable mantiene una referencia que permite encontrar ese objeto en memoria.
Una referencia puede imaginarse como la dirección de una casa: no es la casa, pero indica dónde encontrarla.
string
number
bigint
boolean
undefined
null
symbol
Cuando copias un primitivo, obtienes otro valor independiente.
JavaScript
let puntuacionOriginal = 10;
let puntuacionCopia = puntuacionOriginal;
puntuacionCopia = 20;
console.log(puntuacionOriginal);
console.log(puntuacionCopia);
Cambiar la copia no afecta al original.
Los objetos incluyen estructuras como:
- Objetos literales.
- Arrays.
- Funciones.
- Fechas.
- Mapas y conjuntos.
JavaScript
const usuarioOriginal = {
nombre: "Nicolás",
};
const usuarioCopia = usuarioOriginal;
En este caso no se creó un segundo objeto. Ambas variables apuntan al mismo objeto.
JavaScript
usuarioCopia.nombre = "Nico";
console.log(usuarioOriginal.nombre);
El cambio puede verse desde ambas variables porque existe un único objeto compartido.
Texto
usuarioOriginal ──┐
├──> { nombre: "Nicolás" }
usuarioCopia ─────┘
Las variables son diferentes, pero la referencia conduce al mismo lugar.
Esta asignación solo copia la referencia:
JavaScript
const configuracion = {
tema: "oscuro",
};
const otraConfiguracion = configuracion;
Para crear un objeto exterior nuevo, podemos usar spread:
JavaScript
const otraConfiguracion = {
...configuracion,
};
Ahora son objetos diferentes:
JavaScript
console.log(configuracion === otraConfiguracion);
Sin embargo, spread solo realiza una copia superficial.
JavaScript
const usuario = {
nombre: "Ana",
preferencias: {
tema: "oscuro",
},
};
const copia = {
...usuario,
};
copia.preferencias.tema = "claro";
console.log(usuario.preferencias.tema);
El objeto exterior es nuevo, pero preferencias continúa compartiendo la misma referencia.
Los primitivos se comparan por su valor.
JavaScript
console.log(10 === 10);
console.log("hola" === "hola");
Los objetos se comparan por identidad: deben ser exactamente el mismo objeto.
JavaScript
const primero = { nombre: "Ana" };
const segundo = { nombre: "Ana" };
console.log(primero === segundo);
Aunque contienen la misma información, fueron creados por separado.
JavaScript
const tercero = primero;
console.log(primero === tercero);
Aquí ambas variables apuntan al mismo objeto.
Los primitivos son inmutables. No puedes cambiar una parte interna del valor.
JavaScript
let saludo = "Hola";
saludo[0] = "B";
console.log(saludo);
Para obtener "Bola", necesitas crear un texto nuevo.
Los objetos sí pueden modificarse internamente.
JavaScript
const producto = {
nombre: "Teclado",
stock: 5,
};
producto.stock = 4;
JavaScript siempre pasa argumentos por valor.
La diferencia es que, cuando el argumento es un objeto, el valor copiado es una referencia.
JavaScript
function cambiarNombre(usuario) {
usuario.nombre = "Laura";
}
const perfil = { nombre: "Ana" };
cambiarNombre(perfil);
console.log(perfil.nombre);
La función recibió una copia de la referencia, y esa referencia seguía apuntando al mismo objeto.
Pero reasignar el parámetro no reemplaza la variable exterior:
JavaScript
function reemplazarUsuario(usuario) {
usuario = { nombre: "Carlos" };
}
const perfil = { nombre: "Ana" };
reemplazarUsuario(perfil);
console.log(perfil.nombre);
La función cambió su copia local de la referencia.
React suele detectar cambios comparando referencias.
Esto conserva la misma referencia:
JavaScript
usuario.nombre = "Nico";
setUsuario(usuario);
Esto crea una referencia nueva:
JavaScript
setUsuario({
...usuario,
nombre: "Nico",
});
Por eso las actualizaciones inmutables son tan importantes en el estado de React.
JavaScript
const usuario = { nombre: "Ana" };
usuario.nombre = "Laura";
const protege la variable frente a una reasignación, no el contenido del objeto.
JavaScript
const copia = original;
Solo copia la referencia.
JavaScript
{} === {}
Cada literal crea un objeto distinto.
Spread crea una copia superficial. Los objetos anidados pueden seguir compartidos.
- Los primitivos se copian como valores independientes.
- Las variables de objetos contienen referencias.
- Asignar un objeto a otra variable no lo clona.
- Los objetos se comparan por identidad.
- Spread crea una copia superficial.
- JavaScript pasa todos los argumentos por valor; en objetos, ese valor es una referencia.
- ¿Qué imprime este código?
JavaScript
let a = 5;
let b = a;
b = 8;
console.log(a);
- ¿Qué imprime este código?
JavaScript
const a = { activo: false };
const b = a;
b.activo = true;
console.log(a.activo);
- ¿Por qué dos arrays vacíos no son iguales?
JavaScript
[] === []
Ver respuestas
- ¿Qué imprime este código?
JavaScript
let a = 5;
let b = a;
b = 8;
console.log(a);
Imprime 5. b recibió una copia independiente del número.
- ¿Qué imprime este código?
JavaScript
const a = { activo: false };
const b = a;
b.activo = true;
console.log(a.activo);
Imprime true. Ambas variables apuntan al mismo objeto.
- ¿Por qué dos arrays vacíos no son iguales?
JavaScript
[] === []
Porque cada [] crea un array distinto con una referencia diferente.
null y undefined explica las dos formas principales de representar ausencia de valor en JavaScript.