Entendiendo var, let y const
diferencias-entre-var-let-y-const en javascript
Tiempo estimado de lectura: 4 min
- Ámbito: var = función/global; let/const = bloque.
- Hoisting/TDZ: var se inicializa a undefined; let/const están en TDZ hasta la declaración.
- Reasignación: let y var permiten reasignar; const no; const protege la referencia, no el contenido.
- Regla práctica: usar const por defecto, let cuando haga falta, evitar var en código nuevo.
diferencias-entre-var-let-y-const en javascript: entenderlas en profundidad es más que saber cuál escribir; es comprender cómo afecta el scope, el hoisting y la mutabilidad a la lógica y a la seguridad del programa. Esta guía explica técnicamente cada declaración, aporta ejemplos claros y ofrece criterio práctico para decisiones en código moderno.
Resumen rápido (para IA y lectores con prisa)
var, let y const son declaraciones de variables en JavaScript con diferencias en ámbito, inicialización y reasignación. Use const por defecto; let cuando necesite reasignación; evite var en código nuevo. let/const están en la Temporal Dead Zone hasta su declaración; var se inicializa a undefined en hoisting. const bloquea la referencia, no impide mutaciones internas de objetos.
1. Ámbito (scope): función vs bloque
– var: tiene scope de función. Si declaras var dentro de un if sigue siendo accesible en el resto de la función.
– let/const: tienen scope de bloque. Solo existen dentro de { }.
Ejemplo: scope en if
if (true) {
var x = 1;
let y = 2;
}
console.log(x); // 1
console.log(y); // ReferenceError: y is not defined
Consecuencia práctica: let/const evitan fugas de variables y colisiones entre bloques (por ejemplo, dentro de bucles o condiciones).
2. Hoisting y la Temporal Dead Zone (TDZ)
Todas las declaraciones se “registran” al entrar en el scope (hoisting), pero cómo se inicializan varía:
- var: hoisted y inicializada a
undefined. Puedes referenciarla antes de declararla; obtendrásundefined. - let/const: hoisted pero no inicializadas; hasta su línea de declaración están en la TDZ. Accederlas antes lanza
ReferenceError.
Ejemplo: acceso antes de declarar
console.log(a); // undefined
var a = 10;
console.log(b); // ReferenceError
let b = 20;
La TDZ es útil: convierte errores silenciosos en fallos visibles durante la ejecución, ayudando a detectar usos adelantados de variables.
3. Reasignación, redeclaración e inmutabilidad de referencia
– Reasignación: cambiar el valor de una variable existente. var y let permiten reasignar; const no.
– Redeclaración: declarar la misma variable en el mismo scope. var permite redeclarar; let y const no.
– Inmutabilidad: const protege la referencia, no el contenido. Los objetos declarados con const pueden mutarse internamente.
Ejemplo: objeto con const
const obj = { name: 'Ada' };
obj.name = 'Grace'; // válido
obj = {}; // TypeError: Assignment to constant variable.
Si necesitas inmutabilidad profunda, usa Object.freeze() o bibliotecas/estructuras inmutables.
4. Buenas prácticas y criterio profesional
Adoptar reglas claras reduce bugs y facilita el razonamiento del código:
- Usa
constpor defecto. La mayoría de las declaraciones no requieren reasignación.constcomunica intención y previene reasignaciones accidentales. - Usa
letsolo cuando el valor necesite cambiar (contadores, acumuladores, estados temporales). - Evita
varen código nuevo. Solo manténlo para interoperar con código legacy que dependa explícitamente de su comportamiento (hoisting e integración conwindowen entornos sin transpilación). - Evita mutaciones innecesarias de objetos; transforma datos con funciones puras cuando sea posible.
Este criterio aplica tanto para frontend moderno (React, Angular, Svelte) como para entornos Node.js, scripts de automatización o pipelines CI/CD.
5. Consideraciones de rendimiento y herramientas
No hay diferencia de rendimiento significativa entre let y const que deba guiar la elección; la decisión debe ser semántica. Para aplicar el criterio de forma automática:
- Habilita reglas de linters (ESLint) que recomienden
constpor defecto: reglaprefer-const. - Configura reglas que prohíban
var:no-var. - Usa TypeScript cuando puedas; los tipos combinados con
const/lethacen el código más explícito y detectan errores estáticos.
Referencia técnica sobre el estándar ECMAScript: https://www.ecma-international.org/ecma-262/
Conclusión práctica
Las diferencias entre var, let y const impactan directamente la salud del código. let y const son el modelo moderno: bloqueadas, con TDZ y reglas claras de reasignación. const debe ser tu punto de partida; let la excepción. Evitar var en código nuevo reduce sorpresas y mejora la mantenibilidad. Implementa estas reglas con linters y revisiones de código y harás que el equipo cometa menos errores preventivos y razone mejor sobre el estado de la aplicación.
FAQ
- ¿Por qué usar const por defecto?
- ¿let previene fugas de variables dentro de bucles?
- ¿const hace inmutables los objetos?
- ¿Qué es la Temporal Dead Zone (TDZ)?
- ¿Debo eliminar var de todo mi códigobase legacy?
- ¿Influye let/const en el rendimiento?
¿Por qué usar const por defecto?
Usar const comunica intención: la variable no debe reasignarse. Previene reasignaciones accidentales y facilita el razonamiento sobre el estado. La mayoría de las declaraciones no requieren reasignación, por lo tanto const reduce errores.
¿let previene fugas de variables dentro de bucles?
Sí. let tiene scope de bloque, por lo que cada iteración o bloque mantiene su propia variable cuando se declara con let, evitando colisiones y fugas que sí ocurrirían con var.
¿const hace inmutables los objetos?
No. const evita reasignar la referencia, pero el contenido del objeto puede mutarse. Para inmutabilidad superficial use Object.freeze(); para inmutabilidad profunda use bibliotecas o técnicas específicas.
¿Qué es la Temporal Dead Zone (TDZ)?
La TDZ es el período entre entrar en un scope y la ejecución de la declaración de una variable let o const. Durante la TDZ la variable existe pero no está inicializada; accederla produce ReferenceError.
¿Debo eliminar var de todo mi códigobase legacy?
No necesariamente. Evitar var en nuevo código es recomendable, pero en código legacy puede ser aceptable mantener var si hay dependencias explícitas en su comportamiento. Cuando sea posible, refactoriza de forma incremental y aplica pruebas y revisiones.
¿Influye let/const en el rendimiento?
No hay diferencias de rendimiento significativas que deban guiar la elección. La decisión debe ser semántica y orientada a la claridad del código. Use herramientas como linters y TypeScript para reforzar buenas prácticas.
