Sobes.tech
Junior

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

sobes.tech AI

Respuesta de la IA

var tiene un ámbito de función, mientras que let y const tienen un ámbito de bloque. var puede ser redeclarado y reasignado, let puede ser reasignado pero no redeclarado en el mismo ámbito, y const no puede ser ni redeclarado ni reasignado. Las variables declaradas con var son elevadas (hoisting) con una inicialización a undefined, mientras que let y const también son elevadas pero permanecen en la "zona muerta temporal" hasta su inicialización.

// var tiene ámbito de función
function ejemploVar() {
  if (true) {
    var x = 10;
    console.log(x); // 10
  }
  console.log(x); // 10 (x es visible aquí)
}

// let y const tienen ámbito de bloque
function ejemploLetConst() {
  if (true) {
    let y = 20;
    const z = 30;
    console.log(y); // 20
    console.log(z); // 30
  }
  // console.log(y); // Error ReferenceError: y no está definido
  // console.log(z); // Error ReferenceError: z no está definido
}

// var puede ser redeclarado y reasignado
var a = 1;
var a = 2; // Redeclaración
a = 3; // Reasignación
console.log(a); // 3

// let puede ser reasignado, pero no redeclarado en el mismo ámbito
let b = 4;
// let b = 5; // Error SyntaxError: Identifier 'b' ya ha sido declarado
b = 6; // Reasignación
console.log(b); // 6

// const no puede ser reasignado ni redeclarado
const c = 7;
// const c = 8; // Error SyntaxError: Identifier 'c' ya ha sido declarado
// c = 9; // Error TypeError: Asignación a variable constante.
console.log(c); // 7 (para tipos primitivos)

// Elevación (hoisting)
console.log(hoistedVar); // undefined (var ha sido elevada e inicializada a undefined)
var hoistedVar = "Yo soy var";

// console.log(hoistedLet); // Error ReferenceError: No se puede acceder a 'hoistedLet' antes de la inicialización
// let hoistedLet = "Yo soy let"; // Está en la zona muerta temporal

Las diferencias clave se resumen en la tabla:

Característica var let const
Ámbito de vista Funcional De bloque De bloque
Redeclaración No (en el mismo ámbito) No
Reasignación No (para primitivos)
Elevación Sí (con undefined) Sí (en zona muerta temporal) Sí (en zona muerta temporal)
Inicialización temprana No requiere inicialización No requiere inicialización Requiere inicialización

Es importante notar que para objetos y arrays declarados con const, la variable en sí no puede ser reasignada a otro objeto/array, pero el contenido del objeto/array puede ser modificado.

const miObjeto = { clave: 'valor' };
// miObjeto = { nuevaClave: 'nuevoValor' }; // Error TypeError: Asignación a variable constante.
miObjeto.clave = 'nuevoValor'; // Es posible
console.log(miObjeto); // { clave: 'nuevoValor' }

const miArray = [1, 2];
// miArray = [3, 4]; // Error TypeError: Asignación a variable constante.
miArray.push(3); // Es posible
console.log(miArray); // [ 1, 2, 3 ]