Está la definición constante en Exploring ES6 del Dr. Axel Rauschmayer:
constfunciona como let, pero la variable que declara debe inicializarse inmediatamente, con un valor que no se puede cambiar después . […]const bar = 123; bar = 456; // TypeError: `bar` is read-only
y luego escribe
Trampa: const no hace que el valor sea inmutable
constsolo significa que una variable siempre tiene el mismo valor, pero no significa que el valor en sí sea o se vuelva inmutable.
Estoy un poco confundido con esta trampa. ¿Alguien puede definir claramente la const con esta trampa?
Cuando creas algo const en JavaScript, no puedes reasignar la variable en sí para hacer referencia a otra cosa. Sin embargo, la variable aún puede hacer referencia a un objeto mutable.
const x = {a: 123}; // This is not allowed. This would reassign `x` itself to refer to a // different object. x = {b: 456}; // This, however, is allowed. This would mutate the object `x` refers to, // but `x` itself hasn't been reassigned to refer to something else. xa = 456; En el caso de primitivas como cadenas y números, const es más simple de entender, ya que no muta los valores sino que asigna un nuevo valor a la variable.
MDN lo resume muy bien:
La declaración
constcrea una referencia de solo lectura a un valor. No significa que el valor que contiene sea inmutable, solo que el identificador de la variable no se puede reasignar. Por ejemplo, en caso de que el contenido sea un objeto, esto significa que el objeto en sí aún puede modificarse.
Más sucintamente: const crea un enlace inmutable.
En otras palabras: const , como var , te da un trozo de memoria mutable en el que estás almacenando algo. Sin embargo, const dicta que debe seguir haciendo referencia a ese mismo fragmento de memoria; no puede reasignar la variable a un fragmento de memoria diferente, porque la referencia de la variable es constante.
Para hacer que algo sea realmente constante e inalterable después de haberlo declarado, debe usar algo como Object.freeze() . Sin embargo, eso es superficial y solo funciona en pares clave/valor. Congelar un objeto completo requiere un poco más de esfuerzo. Hacerlo repetidamente de manera eficaz es aún más desafiante. Si realmente lo necesita, le recomiendo que consulte algo como Immutable.js
Las declaraciones const y let controlan si se permiten reenlaces (también conocidos como reasignaciones) entre identificadores y valores:
const x = "initial value"; let y = "initial value"; // rebinding/reassignment try { x = "reassignment" } catch(e) { console.log(x) } // fails y = "reassignment"; // succeeds console.log(y); La inmutabilidad se controla en el nivel de tipo. Object es un tipo mutable, mientras que String es un tipo inmutable:
const o = {mutable: true}; const x = "immutable"; // mutations o.foo = true; // succeeds x[0] = "I"; // fails console.log(o); // {mutable: true, foo: true} console.log(x); // immutable