Object.freeze()
кажется переходным методом удобства перехода к использованию const
в ES6.
Есть ли случаи, когда оба они занимают свое место в коде, или есть предпочтительный способ работы с неизменяемыми данными?
Следует ли мне использовать Object.freeze()
до того момента, как все браузеры, с которыми я работаю, поддерживаются, а const
затем переключиться на их использование const
?
javascript
ecmascript-6
Сергей Башаров
источник
источник
Object.isFrozen
но они также являются их собственным примитивным типом данных ...)Ответы:
const
иObject.freeze
это две совершенно разные вещи.const
применяется к привязкам («переменным»). Он создает неизменяемую привязку, т. Е. Привязке нельзя присвоить новое значение.Object.freeze
работает со значениями , а более конкретно - со значениями объектов . Это делает объект неизменным, т.е. вы не можете изменить его свойства.источник
const
это новоеvar
; это просто блок-область и предотвращает переназначение. Вы можете использоватьlet
, но на самом деле это необходимо только в том случае, если вы собираетесь изменить значение, на которое указывает переменная, что имеет смысл для переменных управления циклом / итератора и простых типов, таких как числа и строки, но не для большинства видов использования объектов (включая массивы). Если вам нужен объект / массив, содержимое которого не может быть изменено,const
вы должны не только объявить его, но и вызватьObject.freeze()
его.const
Это НЕ новыйvar
,let
это новыйvar
В ES5
Object.freeze
не работает с примитивами, которые, вероятно, чаще объявляются с помощью,const
чем объекты. Вы можете заморозить примитивы в ES6, но тогда у вас также есть поддержкаconst
.С другой стороны,
const
используемый для объявления объектов не «замораживает» их, вы просто не можете повторно объявить объект целиком, но вы можете свободно изменять его ключи. С другой стороны, вы можете повторно объявить замороженные объекты.Object.freeze
также является неглубоким, поэтому вам нужно будет рекурсивно применить его к вложенным объектам, чтобы защитить их.источник
ob1.bar.value = 4; // (frozen) modified, because ob1.bar is nested
: Это из-за области применения метода?Резюме:
const
иObject.freeze()
служат совершенно разным целям.const
существует для объявления переменной, которая должна быть задействована сразу и не может быть переназначена. переменные, объявленные с помощью,const
имеют область видимости блока, а не функцию, как переменные, объявленные с помощьюvar
Object.freeze()
- это метод, который принимает объект и возвращает тот же объект. Теперь нельзя удалить какие-либо свойства объекта или добавить какие-либо новые свойства.Примеры
const
:Пример 1. Невозможно переназначить
const
Следующий код вызывает ошибку, потому что мы пытаемся переназначить переменную foo, которая была объявлена с
const
ключевым словом, мы не можем переназначить ее.Пример 2: присвоенные структуры данных
const
могут быть измененыВ этом примере мы объявляем переменную с помощью
const
ключевого слова и назначаем ей объект. Хотя мы не можем переназначить эту переменную, называемую объектом, мы можем изменить сам объект. Если мы изменим существующие или добавим новые свойства, это будет иметь эффект. Чтобы отключить любые изменения объекта нам нужноObject.freeze()
.Примеры
Object.freeze()
:Пример 1. Невозможно изменить замороженный объект
В этом примере, когда мы вызываем
Object.freeze()
и передаемobject1
в качестве аргумента, функция возвращает объект, который теперь «заморожен». Если мы сравним ссылку нового объекта на старый с помощью===
оператора, мы увидим, что они ссылаются на один и тот же объект. Кроме того, когда мы пытаемся добавить или удалить какие-либо свойства, мы видим, что это не имеет никакого эффекта (в строгом режиме будет выдана ошибка).Пример 2: объекты со ссылками не полностью заморожены
Этот пример показывает, что свойства вложенных объектов (и других структур данных по ссылке) по- прежнему изменяемы . Таким
Object.freeze()
образом, объект не «замораживается» полностью, если он имеет свойства, являющиеся ссылками (например, на массивы, объекты).источник
В приведенном выше примере он полностью делает ваш объект неизменным.
Давайте посмотрим на следующий пример.
Это не даст никаких ошибок.
Но если вы попробуете так
Это вызовет ошибку типа «объект только для чтения».
Другой вариант использования
Это бросит
Duplicate declaration "obj"
Также согласно mozilla docs const объяснение
Эти примеры созданы в соответствии с особенностями babeljs ES6.
источник
Пусть будет просто.
Они разные. Проверьте комментарии к коду, которые объяснят каждый случай.
Const
- Это переменная области видимостиlet
, значение которой не может быть переназначено, повторно объявлено.Это значит
Полное понимание состоит в том, что const - это область действия блока, и ее значение не переназначается.
Object.freeze
: Корневые свойства объекта неизменны, также мы не можем добавлять и удалять другие свойства, но мы можем снова переназначить весь объект.// В обоих случаях схоже то, что вложенный объект можно изменять
Спасибо.
источник