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

Можно ли поменять свойство объекта, объявленного через Const?

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

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

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

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

Можно ли изменить свойство объекта, объявленного через const?

Да, можно изменить свойства объекта, объявленного через const. Ключевое слово const в JavaScript относится к самой переменной (ссылке на объект), а не к содержимому объекта. const предотвращает переприсваивание переменной (т.е. нельзя присвоить ей новый объект или значение), но не защищает объект от внутренних изменений (мутаций). Это фундаментальное различие между неизменяемостью ссылки и неизменяемостью данных.

Как работает const с объектами

  • const означает constant reference (постоянная ссылка), а не constant value (постоянное значение).
  • Вы не можете переназначить переменную, но можете изменять её внутреннее состояние.

Пример изменения свойства объекта

const person = {
  name: 'Алексей',
  age: 30
};

// Меняем свойство объекта — это разрешено
person.age = 31;
person.city = 'Москва'; // Добавляем новое свойство
delete person.name;     // Удаляем свойство

console.log(person); // { age: 31, city: 'Москва' }

// А вот переприсвоить переменную нельзя — будет ошибка
// person = { name: 'Мария' }; // TypeError: Assignment to constant variable.

Почему так происходит?

В JavaScript объекты (включая массивы и функции) являются ссылочными типами данных. Переменная person хранит не сам объект, а ссылку на него в памяти. const "фиксирует" эту ссылку, но объект по этой ссылке остаётся изменяемым.

Как сделать объект действительно неизменяемым?

Если нужно запретить любые изменения объекта, используйте методы:

1. Object.freeze()

Замораживает объект: нельзя добавлять, удалять или изменять свойства.

const car = Object.freeze({
  brand: 'Toyota',
  year: 2022
});

car.brand = 'Honda'; // Тихо не сработает в нестрогом режиме
console.log(car.brand); // 'Toyota'

// В strict mode будет ошибка:
// 'use strict';
// car.brand = 'Honda'; // TypeError: Cannot assign to read-only property

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

2. Глубокое замораживание

Рекурсивно применяет Object.freeze() ко всем вложенным объектам.

function deepFreeze(obj) {
  Object.freeze(obj);
  Object.values(obj).forEach(value => {
    if (value && typeof value === 'object') {
      deepFreeze(value);
    }
  });
  return obj;
}

const company = deepFreeze({
  name: 'TechCorp',
  departments: {
    dev: { employees: 50 }
  }
});

company.departments.dev.employees = 60; // Не сработает

3. Иммутабельные структуры данных

Библиотеки типа Immer, Immutable.js или нативный Spread Operator помогают создавать новые объекты вместо изменения существующих.

// Создание нового объекта через spread оператор
const original = { a: 1, b: 2 };
const updated = { ...original, b: 3 }; // Новый объект, original не изменён

// С Immer
import { produce } from 'immer';
const nextState = produce(original, draft => {
  draft.b = 3; // Работает как мутация, но создаёт новый объект
});

Практические рекомендации

  • Используйте const по умолчанию для всех объявлений переменных — это снижает риски случайного переприсваивания.
  • Для защиты объектов от изменений применяйте Object.freeze() или иммутабельные подходы.
  • Помните: const не делает объект неизменяемым, она лишь защищает ссылку.

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