Коротко

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 нельзя переназначить, объект внутри менять можно.»