entries - object defineproperties javascript
Object.freeze() vs const (5)
Object.freeze()
parece un método de conveniencia de transición para avanzar hacia el uso de
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 soporten
const
luego cambie a usar
const
?
Resumen:
const
y
Object.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
tienen un alcance de bloque y no un alcance 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
const foo = 5;
foo = 6;
El siguiente código arroja un error porque estamos tratando de reasignar la variable foo que fue declarada con la palabra clave
const
, no podemos reasignarla.
Ejemplo 2: las estructuras de datos que se asignan a
const
pueden mutarse
const object = {
prop1: 1,
prop2: 2
}
object.prop1 = 5; // object is still mutable!
object.prop3 = 3; // object is still mutable!
console.log(object); // object is mutated
En este ejemplo, declaramos una variable usando la palabra clave
const
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, necesitamos
Object.freeze()
.
Ejemplos
Object.freeze()
:
Ejemplo 1: no se puede mutar un objeto congelado
object1 = {
prop1: 1,
prop2: 2
}
object2 = Object.freeze(object1);
console.log(object1 === object2); // both objects are refer to the same instance
object2.prop3 = 3; // no new property can be added, won''t work
delete object2.prop1; // no property can be deleted, won''t work
console.log(object2); // object unchanged
En este ejemplo, cuando llamamos a
Object.freeze()
y le damos a
object1
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
const object = {
prop1: 1,
nestedObj: {
nestedProp1: 1,
nestedProp2: 2,
}
}
const frozen = Object.freeze(object);
frozen.prop1 = 5; // won''t have any effect
frozen.nestedObj.nestedProp1 = 5; //will update because the nestedObject isn''t frozen
console.log(frozen);
Este ejemplo muestra que las propiedades de los objetos anidados (y otros por estructuras de datos de referencia)
todavía
son
mutables
.
Entonces
Object.freeze()
no ''congela'' completamente el objeto cuando tiene propiedades que son referencias (por ejemplo, Arrays, Objects).
Deja que sea simple.
Ellos son diferentes . Verifique los comentarios en el código, que explicarán cada caso.
Const : es una variable de alcance de bloque como let, cuyo valor no se puede reasignar, volver a declarar.
Eso significa
{
const val = 10; // you can not access it out side this block , block scope variable
}
console.log(val); // undefined because it is block scope
const constvalue = 1;
constvalue = 2; // will give error as we are reassigning the value;
const obj = { a:1 , b:2};
obj.a = 3;
obj.c = 4;
console.log(obj); // obj = {a:3,b:2,c:4} we are not assigning the value of identifier we can
// change the object properties , const applied only on value, not with properties
obj = {x:1}; // error you are reassigning the value of constant obj
obj.a = 2 ; // you can add ,delete element of object
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 modificar, tampoco podemos agregar y eliminar más propiedades, pero podemos reasignar todo el objeto nuevamente.
var x = Object.freeze({data:1,
name:{
firstname:"hero", lastname:"nolast"
}
});
x.data = 12; // the object properties can not be change but in const you can do
x.firstname ="adasd"; // you can not add new properties to object but in const you can do
x.name.firstname = "dashdjkha"; // The nested value are changeable
//The thing you can do in Object.freeze but not in const
x = { a: 1}; // you can reassign the object when it is Object.freeze but const its not allowed
// Una cosa que es similar en ambos es que los objetos anidados son cambiables
const obj1 = {nested :{a:10}};
var obj2 = Object.freeze({nested :{a:10}});
obj1.nested.a = 20; // both statement works
obj2.nested.a = 20;
Gracias.
En ES5
Object.freeze
no funciona en primitivas, que probablemente se declararían más comúnmente usando
const
que objetos.
Puede congelar primitivas en ES6, pero también tiene soporte para
const
.
Por otro lado,
const
utilizado 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ías aplicarlo recursivamente en objetos anidados para protegerlos.
var ob1 = {
foo : 1,
bar : {
value : 2
}
};
Object.freeze( ob1 );
const ob2 = {
foo : 1,
bar : {
value : 2
}
}
ob1.foo = 4; // (frozen) ob1.foo not modified
ob2.foo = 4; // (const) ob2.foo modified
ob1.bar.value = 4; // (frozen) modified, because ob1.bar is nested
ob2.bar.value = 4; // (const) modified
ob1.bar = 4; // (frozen) not modified, bar is a key of obj1
ob2.bar = 4; // (const) modified
ob1 = {}; // (frozen) ob1 redeclared
ob2 = {}; // (const) ob2 not redeclared
const
y
Object.freeze
son dos cosas completamente diferentes.
const
aplica a los
enlaces
("variables").
Crea un enlace inmutable, es decir, no puede asignar un nuevo valor al enlace.
Object.freeze
funciona en
valores
, y más específicamente,
valores de objetos
.
Hace que un objeto sea inmutable, es decir, no puede cambiar sus propiedades.
var obj = {
a: 1,
b: 2
};
Object.freeze(obj);
obj.newField = 3; // You can''t assign new field , or change current fields
El ejemplo anterior hace que su objeto sea completamente inmutable.
Veamos el siguiente ejemplo.
const obj = {
a: 1,
b: 2
};
obj.a = 13; // You can change a field
obj.newField = 3; // You can assign new field.
No dará ningún error.
Pero si lo intentas así
const obj = {
a: 1,
b: 2
};
obj = {
t:4
};
Lanzará un error como ese "obj es de solo lectura".
Otro caso de uso
const obj = {a:1};
var obj = 3;
Duplicate declaration "obj"
También de acuerdo con la explicación const Mozilla docs
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.
Estos ejemplos creados de acuerdo con las características de babeljs ES6.