GUÍA · Variables

Diferencia entre var, let y const en JavaScript

Aprende cuándo usar var, let y const: alcance, reasignación, elevación (hoisting) y zona muerta temporal, con ejemplos y una regla práctica.

Usa const por defecto, let cuando necesites reasignar el valor y evita var en código nuevo. Las tres palabras declaran variables, pero se diferencian en tres aspectos: si pueden reasignarse, dónde son visibles y qué ocurre si las usas antes de declararlas.

Tabla de diferencias

Característicavarletconst
Reasignar el valorSíSíNo
AlcanceFunciónBloqueBloque
Se puede redeclarar en el mismo ámbitoSíNoNo
Uso antes de declararundefinedError (zona muerta temporal)Error (zona muerta temporal)

const: el valor no se reasigna

Con const el nombre queda unido a un valor y no puede apuntar a otro:

JavaScript
const precio = 10;
precio = 12; // TypeError: Assignment to constant variable.

Atención: const no vuelve inmutable un objeto o un array. Lo que no puedes hacer es reasignar la variable:

JavaScript
const lista = [1, 2];
lista.push(3);      // permitido: el array cambia por dentro
console.log(lista); // [1, 2, 3]
lista = [];         // TypeError

let: cuando el valor cambia

Usa let para contadores, acumuladores o estados que se actualizan:

JavaScript
let intentos = 0;
intentos = intentos + 1;
console.log(intentos); // 1

var: alcance de función

var ignora los bloques { } de un if o un for. Eso provoca resultados inesperados:

JavaScript
if (true) {
  var a = 1;
  let b = 2;
}
console.log(a); // 1  (var escapa del bloque)
console.log(b); // ReferenceError: b is not defined

Además, var se eleva (*hoisting*): el navegador conoce el nombre antes de ejecutar la línea, pero su valor es undefined hasta llegar a la asignación.

JavaScript
console.log(x); // undefined
var x = 5;

console.log(y); // ReferenceError: Cannot access 'y' before initialization
let y = 5;

Ese intervalo en el que let y const existen pero no se pueden leer se llama zona muerta temporal. Es una ventaja: convierte un olvido en un error visible.

Un caso clásico con bucles

JavaScript
for (var i = 0; i < 3; i++) {
  setTimeout(() => console.log(i), 0);
}
// 3, 3, 3

for (let j = 0; j < 3; j++) {
  setTimeout(() => console.log(j), 0);
}
// 0, 1, 2

Con let, cada vuelta crea su propia variable. Con var, todas las funciones comparten la misma.

Regla práctica

  1. Empieza declarando con const.
  2. Si el compilador te avisa porque necesitas reasignar, cambia a let.
  3. No uses var salvo que mantengas código antiguo.

Esta costumbre hace el código más fácil de leer: quien lo lea sabe que un const no cambiará de valor.

Última actualización: . Los ejemplos se han comprobado en un navegador actual y en Node.js.