Первое, что я хотел бы прояснить, это то, что между ними нет никакой связи и сравнения, это две совершенно разные вещи.
const
Ключевое слово const применяется к привязкам и создает неизменяемую привязку. Другими словами, привязке нельзя присвоить новое значение.
let person = { name: "Leonardo" }; console.log(person); //output { name: 'Leonardo' }
Теперь добавьте еще один объект и назначьте его объекту person:
let person = { name: "Leonardo" }; let animal = { species: "snake" }; person = animal; console.log(person); //output { species: 'snake' }
Хорошо, если вы измените объявление объекта person на константу, приведенный выше код больше не будет работать:
const person = { name: "Leonardo" }; let animal = { species: "snake" }; person = animal; // ERROR "person" is read-only console.log(person);
Но вы можете изменить его значения:
const person = { name: "Leonardo" }; let animal = { species: "snake" }; person.name = "Lima"; console.log(person); //output { name: 'Lima' }
Имеет смысл, правда?
Object.freeze
Он работает с значениями и делает объект неизменяемым, то есть вы не можете изменять, добавлять или удалять его свойства, но вы можете назначить другой экземпляр.
let person = { name: "Leonardo" }; let animal = { species: "snake" }; Object.freeze(person); person = animal; console.log(person); { species: 'snake' }
Как вы можете видеть выше, даже с помощью Object.freeze я мог назначить объект-животное человеку. А теперь давайте попробуем изменить некоторые свойства человека:
let person = { name: "Leonardo" }; let animal = { species: "snake" }; Object.freeze(person); person.name = "Lima"; //TypeError: Cannot assign to read only property 'name' of object console.log(person);
Как видите, мы не можем изменить какое-либо значение объекта после того, как он заморожен, он неизменяемый. Единственная проблема в том, что это не глубокая заморозка.
let person = { name: "Leonardo", profession: { name: "developer" } }; Object.freeze(person); person.profession.name = "doctor"; console.log(person); //output { name: 'Leonardo', profession: { name: 'doctor' } }
Если вы хотите, чтобы объект был глубоко заморожен, вам нужно создать рекурсивную функцию, чтобы заморозить каждое свойство, которое имеет тип object:
function deepFreeze(object) { let propNames = Object.getOwnPropertyNames(object); for (let name of propNames) { let value = object[name]; object[name] = value && typeof value === "object" ? deepFreeze(value) : value; } return Object.freeze(object); } let person = { name: "Leonardo", profession: { name: "developer" } }; deepFreeze(person); person.profession.name = "doctor"; // TypeError: Cannot assign to read only property 'name' of object console.log(person);
Это все, ребята,
Спасибо за прочтение!