Object.freeze()
parece un método de conveniencia de transición para avanzar hacia el uso const
en 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 const
luego cambiar a usar const
?
javascript
ecmascript-6
Sergei Basharov
fuente
fuente
Object.isFrozen
pero también son su propio tipo de datos primitivos ...)Respuestas:
const
yObject.freeze
son dos cosas completamente diferentes.const
se aplica a los enlaces ("variables"). Crea un enlace inmutable, es decir, no puede asignar un nuevo valor al enlace.Object.freeze
trabaja en valores , y más específicamente, valores de objetos . Hace que un objeto sea inmutable, es decir, no puede cambiar sus propiedades.fuente
const
es 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,const
también debe invocarloObject.freeze()
.const
NO es lo nuevovar
,let
es lo nuevovar
En ES5
Object.freeze
no funciona en primitivas, que probablemente se declararían más comúnmenteconst
que los objetos. Puede congelar primitivas en ES6, pero luego también tiene soporte paraconst
.Por otro lado,
const
para 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.freeze
tambié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:
const
yObject.freeze()
sirven para propósitos totalmente diferentes.const
está ahí para declarar una variable que debe ser asignada de inmediato y no puede ser reasignada. las variables declaradas porconst
son de ámbito de bloque y no de ámbito de función como las variables declaradas convar
Object.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
const
El siguiente código arroja un error porque estamos tratando de reasignar la variable foo que fue declarada con la
const
palabra clave, no podemos reasignarla.Ejemplo 2: las estructuras de datos que se asignan
const
pueden mutarseEn este ejemplo, declaramos una variable usando la
const
palabra 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 damosobject1
como 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