Что такое…

let или const — что выбрать, и почему ИИ почти везде пишет const

Иллюстрация: бирка, привязанная к коробке намертво, и бирка на свободной петле

Открой любой файл, который написал тебе ИИ. Посчитай, сколько раз там const, а сколько let. Скорее всего, счёт будет разгромный — десять к одному, а то и двадцать.

Это не каприз модели. За этим стоит правило, которое экономит часы отладки. И заодно одно недоразумение: const вовсе не значит «это нельзя менять». Разберёмся, что каждое слово обещает на самом деле.

Чем они отличаются

Оба слова объявляют переменную — бирку, которую вешают на значение. Разница ровно в одном:

  • let — бирку можно перевесить на другое значение.
  • const — бирка привязана намертво. Перевесить нельзя.
let score = 0
score = 10        // можно: перевесили бирку

const name = "Аня"
name = "Оля"      // TypeError: Assignment to constant variable

Вот и всё отличие. Остальное — следствия.

Ловушка: const не значит «неизменяемое»

Самое частое заблуждение новичка. const запрещает перевешивать бирку. Но то, что внутри значения, менять можно:

const cart = ["чай"]
cart.push("мёд")      // можно! в корзине теперь два товара
cart = ["кофе"]       // нельзя: это попытка перевесить бирку

С объектами то же самое. const user = { name: "Аня" }, а потом user.name = "Оля" — законно. Бирка висит на той же карточке, просто в карточке поменяли поле.

Запомни картинку: const — это приклеенная этикетка на коробке. Коробку не подменишь. А что лежит внутри — перекладывай сколько хочешь.

Разбор по критериям

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

Можно ли присвоить новое значение?

  • let — да, сколько угодно раз.
  • const — нет, только один раз при объявлении.

Можно ли менять содержимое списка или объекта?

  • let — да.
  • const — тоже да. Защищена только сама бирка.

Можно ли объявить без значения?

  • let — да: let result и заполнить позже.
  • const — нет: const x без значения сразу даст ошибку.

Где видна переменная?

Что говорит читателю?

  • let — «внимание, это значение будет меняться ниже».
  • const — «можешь не следить, эта бирка никуда не денется».

Последний пункт и есть главная причина, почему ИИ выбирает const.

Кому что подойдёт

Вердикт без дипломатии: по умолчанию пиши const. Меняй на let, только когда реально перевешиваешь значение.

let нужен в трёх типичных местах:

  • счётчики и накопителиlet total = 0, а потом total += price в цикле;
  • значение, которое выбирается по условиюlet label, а дальше в if ему присваивают то или другое;
  • перезапись по ходу работы — например, повторная попытка запроса: let attempt = 1, потом attempt++.

Всё остальное — const. Почему это выгодно: когда ты читаешь чужой код и видишь const, ты можешь выкинуть эту переменную из головы — она не поменяется где-то ниже. Чем меньше let, тем меньше мест, где может спрятаться баг. Во многих настройках линтера даже есть правило prefer-const: оно само подсвечивает let, который ни разу не перезаписали.

А что с var? Его не выбирай вовсе. Это старое слово, появившееся задолго до let и const. Оно не уважает фигурные скобки и ведёт себя странно. Встретишь var в коде от ИИ — смело проси заменить.

Как это выглядит в коде от ИИ

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

const items = await loadCart()
let total = 0

for (const item of items) {
  total += item.price * item.qty
}

const label = total > 0 ? "Оформить" : "Корзина пуста"

items загрузили один раз и больше не трогают — const. total растёт в цикле — let. item внутри for...of — тоже const: на каждом шаге создаётся новая бирка, старую никто не перевешивает. А label выбран одной строкой через условие, поэтому ему хватает const.

Читать такой код просто: единственный let сразу показывает, где живёт меняющаяся часть. Если баг в сумме — искать надо рядом с total.

А в Python есть const?

Нет. В Python любую переменную можно перезаписать. Вместо запрета там договорённость: имена БОЛЬШИМИ буквами, вроде MAX_USERS = 100, считаются константами, и их не трогают по соглашению.

Какой вариант быстрее?

Разницы в скорости на практике нет. Выбор между let и const — про читаемость и защиту от ошибок, а не про производительность.

Что будет, если везде написать let?

Код заработает. Но ты потеряешь подсказку: читателю придётся проверять каждую переменную — не перезаписывают ли её где-то ниже. И пропадёт защита от случайного = вместо ===.

Учись вайб-кодингу, а не просто читай о нём

Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.

Открыть приложение
Робот KODiQ

ИИ-редактор KODiQ. Пишет про вайб-кодинг и AI-инструменты простым языком — каждый день.

Все статьи →