В КУРСЕ?

Разбираемся в теме

Объявлен const, а объект изменился: что остаётся постоянным в JavaScript

На собеседовании вопрос о константах часто проверяет не память на ключевые слова, а понимание связей между переменными и объектами. Объявление через const запрещает переназначать созданную привязку. При этом обычный объект, на который она указывает, может сохранять изменяемые свойства. Чтобы разобраться, полезно отдельно отслеживать имена, сами объекты и операции над ними.

Имя и содержимое отвечают на разные вопросы

Представьте карточку с названием ящика. Запрет заменить карточку другой не означает, что содержимое ящика нельзя переставлять. Аналогия помогает различить два действия, хотя настоящая семантика языка точнее бытового сравнения. При объявлении const first = {count: 2} создаётся объект со свойством count и привязка first к нему. Операция first.count = 5 меняет свойство этого объекта. Попытка присвоить first новый объект была бы переназначением и вызвала бы ошибку. В объяснении важно назвать, что именно меняется. Фраза о неизменности всего после const смешивает привязку и данные. Название переменной также ничего не гарантирует: даже слово constant в имени само по себе не защищает содержимое.

Вторая переменная ещё не означает второй объект

Продолжим отдельный пример с исходным значением два. После const first = {count: 2} выполним const second = first. Здесь не создаётся независимая копия содержимого: оба имени связаны с одним объектом. Затем second.count = 5 изменяет именно этот общий объект. Поэтому чтение first.count и second.count даст пять. Удобно нарисовать один прямоугольник и две стрелки к нему. Если вместо рисунка представить два одинаковых ящика, легко ошибочно предсказать, что первое значение останется прежним. На собеседовании сначала опишите связи, затем назовите результат. Такой порядок показывает причинное объяснение, а не удачную догадку по знакомому фрагменту.

Копирование нужно обсуждать вместе с глубиной

Теперь после изменения общего счётчика создадим const third = {...first}. Для нашего простого объекта появляется отдельный объект с собственным числовым свойством count, равным пяти. Операция third.count = 8 изменит это свойство только у третьего объекта: первые два обращения по-прежнему дадут пять. Но такое копирование является поверхностным. Если свойство исходного объекта само содержит другой объект, его ссылка может остаться общей у оригинала и копии. Поэтому вывод о полной независимости любых данных из этого примера не следует. Сначала уточните форму данных: только ли там числа и строки или есть вложенные объекты. Одного слова копия недостаточно, чтобы предсказать все дальнейшие изменения.

Попробуйте на практике

Проверьте значения на бумаге, а затем при желании выполните этот небольшой пример в отдельной учебной среде.

  1. Создайте в записи объект со счётчиком два и подпишите его именем first. Добавьте имя second, связанное с тем же объектом. Посчитайте объекты, а не имена.
  2. Измените счётчик через second на пять. Запишите, что будет прочитано через каждое из двух имён, и объясните ответ одной фразой.
  3. Создайте third поверхностным копированием первого объекта. Измените его числовой счётчик на восемь. Изобразите появившийся отдельный объект.
  4. Сравните предсказания с выполнением примера. Затем отдельно объясните, почему попытка присвоить first новый объект относится к другой операции, чем изменение first.count.

Как проверить результат. После первой правки оба обращения дают пять. После создания и изменения третьего объекта значения через first и second остаются равны пяти, а через third получается восемь. На рисунке должны быть два объекта и три имени. Объяснение должно отдельно упоминать запрет переназначения и возможность изменения свойств.

Частые вопросы

Зачем использовать const, если свойства всё равно меняются?

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

Поверхностная копия всегда опасна?

Нет. Она подходит, когда ожидаемая независимость касается скопированных свойств верхнего уровня, как числовой счётчик в примере. Ошибка возникает, когда разработчик незаметно предполагает независимость вложенных объектов. Проверяйте требование и форму данных вместе.

Самостоятельный разбор темы. Содержание конкретной обучающей программы здесь не представлено.

Зарегистрируйтесь, чтобы уточнить возможность доступа к этому материалу

Зарегистрироваться
← К списку материалов