← Назад к вопросам

Можно ли изменить константу?

2.0 Middle🔥 181 комментариев
#JavaScript Core

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI4 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Можно ли изменить константу в JavaScript?

Ответ на этот вопрос неоднозначен и зависит от контекста определения "константы". В программировании термин "константа" обычно означает значение, которое не должно изменяться после его объявления. Однако в разных языках и с разными типами данных это правило может иметь исключения или особенности реализации. В JavaScript, где этот вопрос наиболее актуален, ситуация особенно интересна.

Константа с точки зрения const

В JavaScript ключевое слово const было добавлено в ES6 (ECMAScript 2015) для объявления переменных, которые, по задумке, являются постоянными. Основное правило:

  • Переменная, объявленная с помощью const, не может быть переприсвоена. Попытка присвоить новое значение приведёт к ошибке.
const PI = 3.14;
PI = 3.14159; // Ошибка: TypeError: Assignment to constant variable.

Таким образом, на самый простой и прямой вопрос — можно ли изменить значение, хранящееся в переменной, объявленной через const — ответ: нет, прямое переприсваивание невозможно.

Но что, если константа хранит объект или массив?

Здесь начинается важная nuance. const гарантирует неизменность самой ссылки на область памяти, где хранится значение. Но не гарантирует неизменность содержимого (состояния) этого значения, если оно является объектом или массивом.

const person = { name: 'Иван', age: 30 };
// Мы можем изменить свойства объекта:
person.age = 31;          // Это работает!
person.city = 'Москва';   // И это тоже работает!
console.log(person); // { name: 'Иван', age: 31, city: 'Москва' }

// Но мы не можем переприсвоить переменную person:
person = { name: 'Петр' }; // Ошибка: TypeError: Assignment to constant variable.

Аналогично для массивов:

const numbers = [1, 2, 3];
numbers.push(4);        // Можно изменять содержимое массива
numbers[0] = 10;        // Можно
console.log(numbers); // [10, 2, 3, 4]

numbers = [5, 6];       // Нельзя переприсвоить

Итог для const: Константа, объявленная через const, защищает от изменения ссылки, но не защищает от изменения внутреннего состояния сложных типов данных (объектов и массивов).

Как создать "истинную", полностью неизменяемую константу?

Если необходимо защитить не только ссылку, но и содержимое объекта, нужно использовать дополнительные методы:

  1. Object.freeze(): Этот метод "замораживает" объект, делая его свойства неизменяемыми.
const immutablePerson = Object.freeze({ name: 'Иван', age: 30 });
immutablePerson.age = 31; // Тихая ошибка в нестрогом режиме (значение не изменится).
// В строгом режиме ('use strict') будет выброшена ошибка TypeError.

Важно: Object.freeze() работает только на первом уровне (shallow freeze). Вложенные объекты внутри замороженного объекта останутся изменяемыми.

  1. Константы с примитивными значениями: Для чисел, строк, булевых значений и null/undefined использование const создаёт полноценную неизменяемую константу, так как эти значения хранятся непосредственно.
const MAX_USERS = 100;
const GREETING = 'Hello World';
const FEATURE_ENABLED = true;
// Эти значения действительно нельзя изменить никаким способом.
  1. Использование Object.defineProperty(): Можно создать свойство объекта с флагом writable: false.
const config = {};
Object.defineProperty(config, 'apiUrl', {
    value: 'https://api.example.com',
    writable: false,
    configurable: false
});
config.apiUrl = 'https://new.url'; // Не изменится, в строгом режиме - ошибка.

Философский и практический взгляд

На практике термин "константа" часто используется в двух смыслах:

  • Константа ссылки (const) — гарантирует, что переменная всегда указывает на один и тот же объект или значение.
  • Константа значения (Immutable Value) — гарантирует, что само состояние данных не может быть изменено.

В большинстве случаев в JavaScript разработчики используют const для первого случая — чтобы защитить ссылку и случайно не переприсвоить переменную. Для защиты данных применяются другие паттерны (immutable libraries, глубокое копирование, freeze).

Вывод: В JavaScript изменить переменную, объявленную как const, путем прямого переприсваивания — нельзя. Однако изменить содержимое объекта или массива, хранящегося в такой переменной — можно, если не применяются специальные методы для создания неизменяемых (immutable) структур данных. Поэтому ответ на вопрос "можно ли изменить константу" требует уточнения: что мы понимаем под "константой" и под "изменением".

Можно ли изменить константу? | PrepBro