Изменчивость — это возможность изменять значение. Изменяемое значение можно изменить, а неизменяемое значение изменить нельзя. Распространенным заблуждением является то, что ключевое слово const делает переменную неизменяемой.
На самом деле, const предотвращает только переназначение. Для типов, не являющихся объектами, значения можно изменить только путем переназначения, поэтому объявление их с помощью «const» фактически делает их неизменяемыми. Рассмотрим, например, следующий код:
const num = 5; num = 7; // illegal reassignment of const variable
В этом коде невозможно изменить значение num. Обратите внимание, что использование или -- по-прежнему считается переназначением, и это указывается в сообщении об ошибке, если мы пытаемся использовать их для переменной, объявленной с помощью const.
const num = 5; num ;//illegal reassignment of constant
Результирующая ошибка:
Uncaught TypeError: Assignment to constant variable.
Объекты принципиально отличаются в отношении изменчивости тем, что их значения могут изменяться без переназначения переменной. Обратите внимание, что переназначение свойств не предотвращается с помощью «const». Переназначение запрещено только для имени переменной.
const obj = {num: 5}; obj.num = 7; //legal obj = {num: 7}; //illegal reassignment
Объекты также могут иметь методы, изменяющие внутренние значения.
const obj = { num: 5, increment(){ this.num ; } } obj.increment(); console.log(obj.num); //6
Можно сделать объект фактически неизменяемым, объявив его с помощью «const» и используя Object.freeze().
const obj = {num: 5}; Object.freeze(obj); obj.num = 7; // doesn't change console.log(obj.num);// still 5
Обратите внимание, что если мы используем строгий режим, попытка изменить значение num фактически приведет к сбою со следующим сообщением об ошибке:
Cannot assign to read only property 'num'
Использования Object.freeze() без const уже достаточно, чтобы сделать этот объект неизменяемым. Однако это не делает имя переменной неизменяемым.
let obj = {num: 5}; Object.freeze(obj); obj = {num: 5}; // new object with old name obj.num = 7; // changes successfully console.log(obj.num);// 7
В этой версии кода происходит переназначение объекта obj. Функция Freeze() была применена к предыдущему объекту с тем же именем, но новый объект никогда не был заморожен, поэтому он является изменяемым.
Иногда вам может потребоваться разрешить изменение значений объекта, но вы не хотите разрешать добавление или удаление свойств. Этого можно добиться с помощью Object.seal().
let obj = {num: 5}; Object.seal(obj); obj.num = 7; // changes console.log(obj.num);// 7 obj.newValue = 42; //cannot add new property to sealed object console.log(obj.newValue);//undefined delete obj.num; //cannot delete property from sealed object console.log(obj.num);// still exists and is 7
Заморозка и запечатывание применяются ко всему объекту. Если вы хотите сделать определенные свойства неизменяемыми, это можно сделать с помощью defineProperty() или defineProperties(). Выбор между этими двумя зависит от того, хотите ли вы повлиять на одно свойство или на несколько свойств.
const obj = {}; Object.defineProperty(obj, 'num',{ value: 5, writable: false, configurable: false }); obj.num = 7; // Cannot change value because writable is false delete obj.num; // Cannot delete because configurable is false console.log(obj.num);//Still exists and is 5
В этом примере определяется новое свойство, но метод defineProperty() также можно использовать для существующего свойства. Обратите внимание: если для параметра «configurable» ранее было установлено значение false, его нельзя изменить на true, но если оно изначально было true, ему можно установить значение false, поскольку это изменение считается типом настройки.
В большинстве случаев вам не нужно гарантировать, что объект является неизменяемым. При возникновении такой необходимости, как правило, достаточно заморозить объект, но у нас есть дополнительные возможности для более тонкого контроля, если такая необходимость возникнет.
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3