Резюме:
const
и Object.freeze()
служат совершенно разным целям.
const
существует для объявления переменной, которая должна быть задействована сразу и не может быть переназначена. переменные, объявленные с помощью, const
имеют область видимости блока, а не функцию, как переменные, объявленные с помощьюvar
Object.freeze()
- это метод, который принимает объект и возвращает тот же объект. Теперь нельзя удалить какие-либо свойства объекта или добавить какие-либо новые свойства.
Примеры const
:
Пример 1. Невозможно переназначить const
Следующий код вызывает ошибку, потому что мы пытаемся переназначить переменную foo, которая была объявлена с const
ключевым словом, мы не можем переназначить ее.
Пример 2: присвоенные структуры данных const
могут быть изменены
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
В этом примере мы объявляем переменную с помощью const
ключевого слова и назначаем ей объект. Хотя мы не можем переназначить эту переменную, называемую объектом, мы можем изменить сам объект. Если мы изменим существующие или добавим новые свойства, это будет иметь эффект. Чтобы отключить любые изменения объекта нам нужно Object.freeze()
.
Примеры Object.freeze()
:
Пример 1. Невозможно изменить замороженный объект
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
В этом примере, когда мы вызываем Object.freeze()
и передаем object1
в качестве аргумента, функция возвращает объект, который теперь «заморожен». Если мы сравним ссылку нового объекта на старый с помощью ===
оператора, мы увидим, что они ссылаются на один и тот же объект. Кроме того, когда мы пытаемся добавить или удалить какие-либо свойства, мы видим, что это не имеет никакого эффекта (в строгом режиме будет выдана ошибка).
Пример 2: объекты со ссылками не полностью заморожены
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);
Этот пример показывает, что свойства вложенных объектов (и других структур данных по ссылке) по- прежнему изменяемы . Таким Object.freeze()
образом, объект не «замораживается» полностью, если он имеет свойства, являющиеся ссылками (например, на массивы, объекты).