Коротко
var |
let |
const |
|
|---|---|---|---|
| Область видимости | function | block {} |
block {} |
| Hoisting | да, undefined |
TDZ | TDZ |
| Повторное объявление | можно | нельзя | нельзя |
| Переназначение | да | да | нет |
const запрещает переназначение привязки, но не делает объект иммутабельным:
const user = { name: "A" };
user.name = "B"; // ок
user = {}; // ошибка
Практика
В современном коде: const по умолчанию, let если значение реально меняется, var — почти никогда.
Короткий ответ
«let/const — блочная область и TDZ, var — функциональная и странный hoisting. const нельзя переназначить, объект внутри менять можно.»