← JavaScript

Fundamentos

¿Cuál es la diferencia entre `var`, `let` y `const`?

Ver respuesta — intenta responderla en voz alta primero

var tiene alcance de función y se puede redeclarar; let y const tienen alcance de bloque. let se puede reasignar, const no. Hoy la recomendación es usar const por defecto y recurrir a let solo cuando necesites reasignar.

  • var: la forma antigua. Tiene alcance de toda la función donde se declara (ignora bloques como if o for). Además sufre hoisting y se inicializa en undefined.
  • let: tiene alcance de bloque ({ }). Puedes cambiar su valor, pero no puedes redeclararla en el mismo bloque.
  • const: también tiene alcance de bloque. No puedes reasignarla. Cuidado: si guarda un objeto o un arreglo, su contenido sí se puede modificar; lo que no puede cambiar es la referencia.

Regla práctica: usa siempre const; cambia a let solo si de verdad necesitas reasignar; evita var.

const nombre = "Mike";
// nombre = "Otro"; // Error: no se puede reasignar una const

let edad = 25;
edad = 26; // OK: let se puede reasignar

// const con un objeto: la referencia no cambia, pero el contenido sí
const usuario = { activo: true };
usuario.activo = false; // OK
console.log(usuario); // { activo: false }

// Alcance de bloque
if (true) {
  var conVar = "visible afuera";
  let conLet = "solo aquí adentro";
}
console.log(conVar); // "visible afuera"
// console.log(conLet); // Error: conLet is not defined

Pensar que const hace que el valor sea "inmutable". No es así: const solo evita reasignar la variable. Un objeto o arreglo declarado con const puede mutar tranquilamente su contenido.

"var tiene alcance de función y hoy en día se evita. let y const tienen alcance de bloque. La diferencia entre ellas es que let se puede reasignar y const no. Yo uso const por defecto y solo cambio a let cuando necesito reasignar el valor. Un punto importante: const no hace inmutable a un objeto, solo evita cambiar la referencia."

Reto rápido

¿Qué imprime este código y por qué?

for (var i = 0; i < 3; i++) {}
console.log(i);
Ver respuesta

Imprime 3. Como var tiene alcance de función (no de bloque), la variable i sigue existiendo después del bucle for y conserva su último valor.