javascript - sirve - let en jquery
La palabra clave ''const'' no hace que el valor sea inmutable. Qué significa eso? (5)
Existe la definición constante en Exploring ES6 del Dr. Axel Rauschmayer:
const
funciona como let, pero la variable que declares 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
Peligro: const no hace que el valor sea inmutable
const
solo 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?
const significa: no puede cambiar el valor asignado inicialmente.
Primero, defina qué es un valor en js. El valor puede ser: booleanos, cadenas, números, objetos, funciones y valores indefinidos.
Me gusta: la gente te llama con tu nombre, no está cambiando. Sin embargo, te cambias de ropa. El vínculo entre las personas y usted es su nombre. El resto puede cambiar. Perdón por el extraño ejemplo.
Entonces, déjame darte algunos ejemplos:
// boolean
const isItOn = true;
isItOn = false; // error
// number
const counter = 0;
counter++; // error
// string
const name = ''edison'';
name = ''tesla''; // error
// objects
const fullname = {
name: ''albert'',
lastname: ''einstein''
};
fullname = { // error
name: ''werner'',
lastname: ''heisenberg''
};
// NOW LOOK AT THIS:
//
// works because, you didn''t change the "value" of fullname
// you changed the value inside of it!
fullname.name = ''hermann'';
const increase = aNumber => ++aNumber;
increase = aNumber => aNumber + 1; // error
// NOW LOOK AT THIS:
//
// no error because now you''re not changing the value
// which is the decrease function itself. function is a
// value too.
let anotherNumber = 3;
const decrease = () => --anotherNumber;
anotherNumber = 10; // no error
decrease(); // outputs 9
const chaos = undefined;
chaos = ''let there be light'' // error
const weird = NaN;
weird = 0 // error
Como puede ver, a menos que no esté cambiando el "primer" valor asignado a una constante, no hay error. Cada vez que intenta cambiar el primer valor asignado a otra cosa, se enoja y da un error.
Entonces, esto es lo segundo que puede saber al usar
const
.
Es decir,
debe inicializarse a un valor en su declaración o se enojará.
const orphan; // error
const rich = 0; // no error
Rebobinado
const
declaraciones
const
y
let
controlan si se
let
los cambios (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);
Inmutabilidad
La inmutabilidad se controla a 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
ES2015
clave
const
ES6
/
ES2015
:
La palabra clave
const
se usa para declarar una variable de ámbito de bloque (como declarar con
let
).
La diferencia entre declarar una variable con
const
y
let
es la siguiente:
-
Una variable declarada
const
no se puede reasignar . -
Una variable declarada con
const
debe asignarse cuando se declara . Esta es una consecuencia lógica del punto anterior porque una variable declarada conconst
no se puede reasignar, es por eso que tenemos que asignarla exactamente una vez cuando declaramos la variable .
Ejemplo:
// we declare variable myVariable
let myVariable;
// first assignment
myVariable = ''First assingment'';
// additional assignment
myVariable = ''Second assignment'';
// we have to declare AND initialize the variable at the same time
const myConstant = 3.14;
// This will throw an error
myConstant = 12;
En el ejemplo anterior podemos observar lo siguiente:
-
La variable
myVariable
declarada conlet
puede declararse primero y luego asignarse. -
La variable
myConstant
declarada conconst
debe declararse y asignarse al mismo tiempo. -
Cuando intentamos reasignar la variable
myConstant
obtenemos el siguiente error:
TypeError no capturado: asignación a variable constante
Advertencia: la variable asignada con
const
todavía es mutable:
Una variable declarada con
const
simplemente no se puede reasignar,
todavía es mutable
.
Ser mutable significa que la estructura de datos (objeto, matriz, mapa, etc.) que se asignó a la variable
const
todavía se puede alterar (es decir, mutar).
Ejemplos de mutación son:
- Agregar / eliminar / alterar una propiedad de un objeto
- Cambiar el valor de una matriz en un índice de matriz específico
Si realmente quiere que un objeto no sea mutable, deberá usar algo como
Object.freeze()
.
Este es un método que congela un objeto.
Un objeto congelado ya no se puede cambiar y no se pueden agregar nuevas propiedades.
Ejemplo:
const obj = {prop1: 1};
obj.prop1 = 2;
obj.prop2 = 2;
console.log(obj);
// We freeze the object here
Object.freeze(obj);
obj.prop1 = 5;
delete obj.prop2;
// The object was frozen and thus not mutated
console.log(obj);
Cuando haces algo
const
en JavaScript, no puedes reasignar la variable misma 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.
x.a = 456;
En el caso de primitivas como cadenas y números,
const
es más fácil de entender, ya que no muta los valores, sino que asigna un nuevo valor a la variable.
MDN resume muy bien:
La declaración const crea una referencia de solo lectura a un valor. No significa que el valor que posee es inmutable, solo que el identificador de variable no se puede reasignar. Por ejemplo, en caso de que el contenido sea un objeto, esto significa que el objeto en sí puede ser alterado.
Más sucintamente: const crea una unión inmutable.
En otras palabras: const, como var, te da una porción mutable de memoria en la que estás almacenando algo. Sin embargo, const dicta que debe seguir refiriéndose a ese mismo fragmento de memoria: no puede reasignar la variable a un fragmento diferente de memoria, porque la referencia de la variable es constante.
Para hacer algo realmente constante e inmutable 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 eficiente es aún más desafiante.
Si realmente lo necesita, le recomiendo que consulte algo como
Immutable.js