Object.freeze()parece un método de conveniencia de transición para avanzar hacia el uso consten ES6.
¿Hay casos en que ambos toman su lugar en el código o hay una forma preferida de trabajar con datos inmutables?
¿Debo usar Object.freeze()hasta el momento en que todos los navegadores con los que trabajo sean compatibles y constluego cambiar a usar const?
javascript
ecmascript-6
Sergei Basharov
fuente
fuente

Object.isFrozenpero también son su propio tipo de datos primitivos ...)Respuestas:
constyObject.freezeson dos cosas completamente diferentes.constse aplica a los enlaces ("variables"). Crea un enlace inmutable, es decir, no puede asignar un nuevo valor al enlace.Object.freezetrabaja en valores , y más específicamente, valores de objetos . Hace que un objeto sea inmutable, es decir, no puede cambiar sus propiedades.fuente
constes lo nuevovar; solo tiene un alcance de bloque y evita la reasignación. Puede usarlet, pero realmente solo necesita hacerlo si va a cambiar el valor al que apunta una variable, lo que tiene sentido para las variables de control / iterador de bucle y tipos simples como números y cadenas, pero no para la mayoría de los usos de objetos (incluidos matrices). Si desea un objeto / matriz cuyo contenido no se puede cambiar, entonces, además de declararlo,consttambién debe invocarloObject.freeze().constNO es lo nuevovar,letes lo nuevovarEn ES5
Object.freezeno funciona en primitivas, que probablemente se declararían más comúnmenteconstque los objetos. Puede congelar primitivas en ES6, pero luego también tiene soporte paraconst.Por otro lado,
constpara declarar objetos no los "congela", simplemente no puede volver a declarar todo el objeto, pero puede modificar sus claves libremente. Por otro lado, puedes redeclarar objetos congelados.Object.freezetambién es poco profundo, por lo que deberá aplicarlo recursivamente en objetos anidados para protegerlos.fuente
ob1.bar.value = 4; // (frozen) modified, because ob1.bar is nested: ¿Es por el alcance del método?Resumen:
constyObject.freeze()sirven para propósitos totalmente diferentes.constestá ahí para declarar una variable que debe ser asignada de inmediato y no puede ser reasignada. las variables declaradas porconstson de ámbito de bloque y no de ámbito de función como las variables declaradas convarObject.freeze()es un método que acepta un objeto y devuelve el mismo objeto. Ahora al objeto no se le puede quitar ninguna de sus propiedades o agregar nuevas propiedades.Ejemplos
const:Ejemplo 1: no se puede reasignar
constEl siguiente código arroja un error porque estamos tratando de reasignar la variable foo que fue declarada con la
constpalabra clave, no podemos reasignarla.Ejemplo 2: las estructuras de datos que se asignan
constpueden mutarseEn este ejemplo, declaramos una variable usando la
constpalabra clave y le asignamos un objeto. Aunque no podemos reasignar a esta variable llamada objeto, podemos mutar el objeto en sí. Si cambiamos las propiedades existentes o agregamos nuevas propiedades, esto tendrá efecto. Para deshabilitar cualquier cambio en el objeto que necesitamosObject.freeze().Ejemplos
Object.freeze():Ejemplo 1: no se puede mutar un objeto congelado
En este ejemplo, cuando llamamos
Object.freeze()y damosobject1como argumento, la función devuelve el objeto que ahora está 'congelado'. Si comparamos la referencia del nuevo objeto con el antiguo usando el===operador, podemos observar que se refieren al mismo objeto. Además, cuando intentamos agregar o eliminar propiedades, podemos ver que esto no tiene ningún efecto (arrojará un error en modo estricto).Ejemplo 2: los objetos con referencias no están completamente congelados
Este ejemplo muestra que las propiedades de los objetos anidados (y otros por estructuras de datos de referencia) siguen siendo mutables . Por
Object.freeze()lo tanto , no 'congela' completamente el objeto cuando tiene propiedades que son referencias (por ejemplo, matrices, objetos).fuente
El ejemplo anterior hace que su objeto sea completamente inmutable.
Veamos el siguiente ejemplo.
No dará ningún error.
Pero si lo intentas así
Lanzará un error como ese "obj es de solo lectura".
Otro caso de uso
Arrojará
Duplicate declaration "obj"También de acuerdo con la explicación de Mozilla docs const
Estos ejemplos creados de acuerdo con las características de babeljs ES6.
fuente
Deja que sea simple.
Ellos son diferentes. Verifique los comentarios en el código, eso explicará cada caso.
Const- Es una variable de alcance de bloque comolet, cuyo valor no se puede reasignar, volver a declarar.Eso significa
Todo el entendimiento es que const es un alcance de bloque y su valor no se reasigna.
Object.freeze: Las propiedades de la raíz del objeto no se pueden cambiar, tampoco podemos agregar y eliminar más propiedades, pero podemos reasignar todo el objeto nuevamente.// Una cosa que es similar en ambos es que los objetos anidados son cambiables
Gracias.
fuente