La redeclaración es volver a declarar una variable, y la reasignación es volver a asignar un valor.
Una variable declarada con var puede ser redeclarada y reasignada.
Una variable declarada con let puede ser reasignada, pero no redeclarada.
Una variable declarada con const no puede ser redeclarada, ni reasignada. Su declaración y asignación debe ser en una línea, caso contrario habrá un error.
Existe un curso de ECMAScript 6+ para que descubras las nuevas características que agregan al lenguaje.
Ejemplos de redeclaración y reasignación de variables
// Con varvar nombre // declaración (undefined) ✅nombre ="Andres"// asignación ✅nombre ="Valeria"// reasignación ✅var nombre ="Oscar"// redeclaración y reasignación ✅// Con letlet nombre // declaración (undefined) ✅nombre ="Andres"// asignación ✅nombre ="Valeria"// reasignación ✅let nombre ="Oscar"// SyntaxError: Identifier 'nombre' has already been declared. ❌// Con const const nombre // SyntaxError: Missing initializer in const declaration. ❌const nombre ="Andres"// declaración y asignación ✅nombre ="Valeria"// TypeError: Assignment to constant variable. ❌const nombre ="Oscar"// SyntaxError: Identifier 'nombre' has already been declared. ❌
Estructuras de datos declaradas con const
Las estructuras de datos, como los arrays u objetos, declaradas con const pueden cambiar las referencias de sus elementos, a este concepto se lo denomina mutabilidad. Sin embargo, siguen las mismas reglas ya mencionadas, no puedes redeclarar ni reasignar una variable de estructura de datos.
const array =["manzana","pera"]// declaración y asignación ✅array[0]="piña"// Cambio de valor en un elemento del array console.log(array)// [ 'piña', 'pera' ]const array =[1,2,3]// SyntaxError: Identifier 'array' has already been declared. ❌
En React, una librería de JavaScript, puedes utilizar declaraciones con const para el estado de un componente, porque aunque cambie el valor, lo que sucede internamente es un re-renderizado y no una redeclaración. No te preocupes si no lo entiendes, pero tenlo presente cuando llegues a ese tema.
Como la palabra reservada lo indica, const hace referencia a un valor que no va a cambiar (o que no debería cambiar), por lo que al intentar reasignar el valor que tenga una variable de tipo constante vamos tener un error. 💥
.
const se usa mucho para declarar funciones u objetos (una función también es considerada un objeto dentro de JavaScript), ya que los objetos pueden almacenar más de un único valor, a diferencia de los tipos primitivos (int, float, string...). Los objetos pueden almacenar muchos valores, así que solo se guarda la referencia en memoria que los almacena (una dirección que no cambia) y con esta se accede al valor o valores que ahí residen.
.
Es como si una variable de tipo primitivo fuese una caja pequeña donde solo te cabe una cosa, mientras que un objeto es como un escaparate o armario (no sé cómo le llames), donde puedes guardar varias cosas.
.
Cuando usamos const para declarar una variable primitiva imagina que estamos creando un molde específico para guardar solo ese valor, que cualquier otra cosa que intentemos meter ahí no se va a poder porque no cabe. Bien, cuando usamos const para un objeto, el comportamiento se ve un poco diferente, ya que como ahí podemos meter varias cosas es más fácil apuntar a una ubicación que no cambie y ahí meter lo que quepa. 😅
.
Vayamos a un ejemplo: Tenemos una caja pequeña con un diseño único, donde solo cabe tu reloj de edición limitada. También tienes un armario grande donde guardas ropa, perfumes, zapatos, e inclusive una caja que contenga un reloj adentro. Ahora, vamos a suponer que le pedimos el favor a alguien de traernos el reloj de edición limitada, podemos expresar la ubicación del reloj diciendo que está en su caja. Ahora para que me busque algo que está en el armario, supongamos el perfume, voy a decir de forma general que está en el armario, que en ese objeto más grande busque lo que yo le pedí, y bueno, si soy organizado y tengo la decencia de ser más específico puedo decir que está en la gaveta del armario que tengo marcada como número 2 y así conseguir lo que necesitaba. ✌🏻 Dentro del armario yo puedo meter, cambiar y quitar cosas, eso no cambiará la ubicación del armario, ya que sigue siendo constante. 😉
la regla de tontos a partir de ES6 es declara cualquier variable con const y si te da problemas redeclarala con let. Para iniciar está regla funciona muy bien. Luego con la practica uno sabe cuando debe ir let o const.
Se introdujeron en ECMAScript 6 y tienen las siguientes características:
var:
se puede acceder desde cualquier lugar del scope (es global)
se puede redeclarar
se puede reasignar
let:
esta limitada por el scope donde es declarada
NO se puede redeclarar en el mismo scope
se puede reasignar
const:
esta limitada por el scope donde es declarada
NO se puede redeclarar en el mismo scope
NO se puede reasignar
Nota: se pueden utilizar métodos como push o pop para los arrays debido a que los métodos hacen referencia a la constante declarada y no la están redeclarando o reasignando.
Me encanta la actitud del profe, la forma tan profesional de explicar y su metodología. Realmente vine aquí porque quiero profundizar sobre el tema de Scope y variables, y estoy muy a gusto porque he entendido paso a paso. Graciaaaaaas!! 💚😀
En otros cursos, no recuerdo si en platzi pero si cuando veía algunos videos de youtube no hablaban de asignación sino de inicialización. Me queda la duda de cual sería la diferencia o cual debe utilizarse. Yo personalmente me iré por la palabra asignación. Sin embargo, me queda esa duda.
Si no estoy mal en el curso básico de Javascript se adopta el término de inicialización, pero según entiendo la asignación es igual que la inicialización, por lo que son dos maneras de llamar a lo mismo.
Me parece demasiado cool ver que los comentarios no son de hace tanto tiempo como en otros cursos que eran de hace 2 años o mas, da una sensación como de que el curso esta mas vivo.
Y no es que en los otros no hubiera comentarios nuevos, pero los mas destacados eran antiguos y no se, es diferente la sensación. Tekiero mucho comunidad de Platzi <3
Por lo que debemos recordar que el const no creará variables inmutables sino que creará una "atadura" inmutable. Una frase que me ayudó a entender ese concepto es: "const won't create immutable variables, const will create immutable bindings".
Tip extra: Si quieren crear un objeto inmutable, pueden pasarlo por el método Object.freeze.
const person ={name:"David",username:"d4vsanchez"};Object.freeze(person);person.name="Someone else";person.username="someone";console.log(`${person.name} (@${person.username})`);// David (@d4vsanchez)