ПрограммированиеFrontend разработчик

Объясните разницу между декларацией переменных с помощью let, const и var в TypeScript. Как их выбор влияет на область видимости, возможность повторного объявления, мутабельность значения и защиту от ошибок? Приведите примеры типичных сценариев использования каждого способа объявления.

Проходите собеседования с ИИ помощником Hintsage

Ответ.

В TypeScript (как и в современном JavaScript) переменные можно объявлять с помощью let, const и var, и между ними есть важные различия:

  • let — Блочно-ограниченная область видимости, переменную можно переопределить (присвоить новое значение), но нельзя объявить второй раз в одной и той же области видимости.
  • const — Тоже блочная область видимости, значение должно быть присвоено сразу, нельзя переопределять (но внутренние свойства объекта, объявленного через const, изменяемы!).
  • var — Функциональная область видимости, возможен механизм поднятия (hoisting), переменную можно переобъявлять и изменять.

Пример:

if (true) { let a = 10; const b = 20; var c = 30; } console.log(c); // 30 — видна вне блока! console.log(a); // Error: a is not defined console.log(b); // Error: b is not defined

Типовые сценарии:

  • const — для значения, которое не должно изменяться (константы, настройки, ссылки на функции).
  • let — для значений, которые изменяются при выполнении (счетчики, переменные в цикле).
  • var — использовать не рекомендуется, только для поддержки старого кода.

Вопрос с подвохом.

Может ли const сделать объект полностью неизменяемым? Объясните, приведите пример.

Ответ: Нет, const предотвращает только изменение самой ссылки, но не защищает от изменений свойств объекта!

const obj = { x: 1 }; obj.x = 2; // Это допустимо! obj = { x: 3 }; // Ошибка: присвоение новое ссылки

Для полной иммутабельности используют Object.freeze:

const frozen = Object.freeze({ x: 1 }); frozen.x = 2; // Ошибка в строгом режиме, но не всегда компилятор предупреждает!

Примеры реальных ошибок из-за незнания тонкостей темы.


История

В процессе миграции крупного фронтенд-проекта на TypeScript разработчики массово заменили var на let, не учтя, что область видимости теперь блочная. Это привело к тому, что счетчики в некоторых for-циклах оказались недоступны вне цикла, и возникли неожиданные ошибки в логике: код перестал работать при попытках обратиться к счетчику цикла после завершения цикла.


История

Разработчик объявил константу через const для хранения объекта конфигурации, считая, что свойства защищены от изменений. Позже в рантайме другое место программы поменяло свойство: это вызвало трудноуловимые ошибки в обработке данных, потому что внешний код "нежданно" поменял глобальные настройки для всех пользователей.


История

В проекте одновременно использовались let, const и var без четкой политики. Один компонент переобъявил var-переменную в рамках функции, в то время как другое место ожидало, что переменная объявлена через let и потому вне блока она не будет видна. Итог: перекрытие переменных, сбои во внутренней логике и сложный дебаг проблем с неочевидным жизненным циклом переменных.