La mutabilidad es la capacidad de cambiar un valor. Un valor mutable se puede cambiar y un valor inmutable no se puede cambiar. Un error común es pensar que la palabra clave "const" hace que una variable sea inmutable.
En realidad, "const" solo evita la reasignación. Para los tipos que no son de objeto, los valores solo se pueden cambiar mediante reasignación, por lo que declararlos con "const" en realidad los hace inmutables. Considere, por ejemplo, el siguiente código:
const num = 5; num = 7; // illegal reassignment of const variable
No hay forma de cambiar el valor de num en este código. Tenga en cuenta que el uso de o -- todavía se considera reasignaciones, y eso se indica en el mensaje de error si intentamos usarlos en una variable declarada con const.
const num = 5; num ;//illegal reassignment of constant
El error resultante es:
Uncaught TypeError: Assignment to constant variable.
Los objetos son fundamentalmente diferentes con respecto a la mutabilidad en que sus valores pueden cambiar sin reasignación de la variable. Tenga en cuenta que "const" no impide la reasignación de propiedades. Sólo se impide la reasignación del nombre de la variable.
const obj = {num: 5}; obj.num = 7; //legal obj = {num: 7}; //illegal reassignment
Los objetos también pueden tener métodos que cambian los valores internos.
const obj = { num: 5, increment(){ this.num ; } } obj.increment(); console.log(obj.num); //6
Es posible hacer que un objeto sea realmente inmutable declarándolo con "const" y usando Object.freeze().
const obj = {num: 5}; Object.freeze(obj); obj.num = 7; // doesn't change console.log(obj.num);// still 5
Tenga en cuenta que si usamos el modo estricto, el intento de cambiar el valor numérico en realidad provocaría un bloqueo con el siguiente mensaje de error:
Cannot assign to read only property 'num'
El uso de Object.freeze() sin "const" ya es suficiente para hacer que este objeto sea inmutable. Sin embargo, no hace que el nombre de la variable sea inmutable.
let obj = {num: 5}; Object.freeze(obj); obj = {num: 5}; // new object with old name obj.num = 7; // changes successfully console.log(obj.num);// 7
Lo que sucede en esta versión del código es que obj se reasigna. Freeze() se aplicó al objeto anterior que compartía el mismo nombre, pero el nuevo objeto nunca se congeló, por lo que es mutable.
Hay ocasiones en las que es posible que desees permitir que los valores de un objeto cambien, pero no deseas permitir que se agreguen o eliminen propiedades. Esto se puede lograr usando Object.seal().
let obj = {num: 5}; Object.seal(obj); obj.num = 7; // changes console.log(obj.num);// 7 obj.newValue = 42; //cannot add new property to sealed object console.log(obj.newValue);//undefined delete obj.num; //cannot delete property from sealed object console.log(obj.num);// still exists and is 7
La congelación y el sellado se aplican a todo el objeto. Si desea que propiedades específicas sean inmutables, puede hacerlo usando defineProperty() o defineProperties(). La elección entre estos dos depende de si desea afectar una sola propiedad o varias propiedades.
const obj = {}; Object.defineProperty(obj, 'num',{ value: 5, writable: false, configurable: false }); obj.num = 7; // Cannot change value because writable is false delete obj.num; // Cannot delete because configurable is false console.log(obj.num);//Still exists and is 5
En este ejemplo se define una nueva propiedad, pero defineProperty() también se puede utilizar en una propiedad existente. Tenga en cuenta que si "configurable" se estableció previamente en falso, no se puede cambiar a verdadero, pero si originalmente era verdadero, se puede establecer en falso, ya que este cambio cuenta como un tipo de configuración.
En la mayoría de los casos, no será necesario garantizar que un objeto sea inmutable. Cuando surge tal necesidad, generalmente es suficiente congelar el objeto, pero tenemos opciones adicionales para controles más precisos si surgen tales necesidades.
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3