Все три имени создаются при входе в scope, но инициализация разная — отсюда разный доступ «до объявления».
Детали
var — сразу undefined, чтение до строки даёт undefined.
let / const — в TDZ до выполнения объявления; доступ → ReferenceError.
const дополнительно требует инициализатор и запрещает reassignment.
console.log(a); // undefinedvar a = 1;
console.log(b); // ReferenceErrorlet b = 2;
const c = 3; // без = нельзя
Движок не перемещает текст программы — меняется модель инициализации binding.
Итог
Hoisting есть у всех трёх; «безопасный доступ раньше» — только у var. let/const падают в TDZ — это фича, не баг.
На собеседовании
Ожидают не заученную таблицу, а умение связать концепцию с багом из практики: что сломается, если выбрать неправильный вариант, и какой код вы напишете в реальном PR. Короткий пример и граничный случай обычно ценятся выше длинной теории.
Как отличается hoisting у `var`, `let` и `const`? · Sobeso