En ECMAScript 6 (ES6 o ES2015) fueron publicadas varias características nuevas que dotaron de gran poder al lenguaje, dos de estas son una nueva forma de declaración de variables con let
y const
, y funciones flechas.
Hasta ahora aprendiste a declarar variables con var
, sin embargo, a partir de la especificación de ES6 se agregaron nuevas formas para la declaración de variables.
Las nuevas palabras reservadas let
y const
resuelven varios problemas con var
como el scope, hoisting, variables globales, re-declaración y re-asignación de variables.
La re-declaración es volver a declarar una variable, y la re-asignación es volver a asignar un valor. Entonces cada palabra reservada tiene una forma diferente de manejar variables:
var
puede ser re-declarada y re-asignada.let
puede ser re-asignada, pero no re-declarada.const
no puede ser re-declarada, ni re-asignada. Su declaración y asignación debe ser en una línea, caso contrario habrá un error.En conclusión, si intentas re-declarar una variable declarada con let y const habrá un error de “variable ya declarada”; por otro lado, si intentas re-asignar una variable declarada con const
existirá un “error de tipo”.
En los demás casos, JavaScript lo aceptará como válidos, algo problemático con var
, por eso deja de utilizarlo.
// Declaración de variables
var nameVar
let nameLet
// Asignación de variables
nameVar= "soy var"
nameLet = "soy let"
Aunque realmente lo que pasa si no asignas un valor en la declaración, JavaScript le asigna un valor undefined
.
const pi // SyntaxError: Missing initializer in const declaration.
pi = 3.14
var nameVar = "soy var"
let nameLet = "soy let"
const nameConst = "soy const"
// Re-declaración de variables
var nameVar = "var soy"
console.log(nameVar) // 'var soy'
let nameLet = "let soy" // SyntaxError: Identifier 'nameLet' has already been declared.
const nameConst = "const soy" //SyntaxError: Identifier 'nameConst' has already been declared.
var nameVar = "soy var"
let nameLet = "soy let"
const nameConst = "soy const"
// Re-asignación de variables
nameVar = "otro var"
console.log(nameVar) // 'otro var'
nameLet = "otro let"
console.log(nameVar) // otro let'
nameConst = "otro const" //TypeError: Assignment to constant variable.