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 | Sí | No (en el mismo ámbito) | No |
| Reasignación | Sí | Sí | 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 ]