ES6 представил новое объявление под названием const для объявления переменных как содержащих постоянные (т.е. неизменяемые) значения.

Вот определение const из веб-документов MDN.

Константы имеют блочную область видимости, как и переменные, определенные с помощью оператора let. Значение константы не может измениться путем переназначения и не может быть повторно объявлено.

Это означает, что если вы объявите переменную как const, она станет значением только для чтения, и вы не сможете изменить ее значение после первоначального присвоения. Это приведет к ошибке, как показано ниже:

Но происходит интересная вещь, когда мы объявляем объект как значение const.
Хотя вы не можете изменить значение объекта, вы все равно можете обновить значения его свойств!

Как видно на изображении выше, переменная с именем stationaryBox объявлена ​​как const. Итак, когда вы пытаетесь заменить значение объекта, выдает ошибку. Однако вы по-прежнему можете получить доступ к значениям свойств объекта (например, ключ pencils в приведенном выше примере) и обновить их по отдельности. То же самое происходит при объявлении массива как const .

Тогда как вы действительно можете предотвратить обновление объекта?

Есть несколько способов сделать это в сочетании с объявлением const:

1) Использование дескрипторов свойств объекта

Каждое свойство объекта определяется 3 дескрипторами:
a) перечисляемое: если true, свойство будет перечислено в циклах
b) перезаписываемое: если true , значение свойства может быть изменено
c) настраивается : если true, дескрипторы свойства могут быть изменены

Таким образом, мы можем предотвратить обновление объекта, установив значение дескриптора на writable:false, configurable: false для всех свойств объекта, как показано ниже:

const stationaryBox = {
  pencils: 2,
  pens: 3,
  eraser: 1
};
Object.defineProperties(stationaryBox, {
  pencils: {enumerable: true, writable: false, configurable: false},
  pens: {enumerable: true, writable: false, configurable: false},
  eraser: {enumerable: true, writable: false, configurable: false}
});

2) Использование Object.freeze()

Вместо установки writable: false, configurable: false для каждого свойства существует метод Object с именем freeze(), который вы можете использовать и который делает то же самое, что и выше, для всех свойств объекта.

const stationaryBox = {
  pencils: 2,
  pens: 3,
  eraser: 1
};
Object.freeze(stationaryBox);

Если вместо этого вы хотите просто предотвратить добавление новых свойств, вы можете использовать Object.preventExtensions(obj) . Чтобы предотвратить как добавление, так и удаление свойств, вы можете использовать Object.seal(obj) .