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?
Код заработает. Но ты потеряешь подсказку: читателю придётся проверять каждую переменную — не перезаписывают ли её где-то ниже. И пропадёт защита от случайного = вместо ===.
Короткие уроки-истории, симулятор агента и ежедневная практика — в нашем мобильном приложении. Бесплатно.





