Чем отличаются типы переменных и как это влияет на код?
Основы языка
Переменные различаются способом объявления (`var`/`let`/`const`) — по области видимости, hoisting и изменяемости — и типом хранимого значения (примитив или ссылка).
По способу объявления
- var — функциональная область, hoisting в
undefined, переобъявление разрешено (legacy). - let — блочная область, TDZ, переприсваивание разрешено.
- const — блочная область, TDZ, переприсваивание ссылки запрещено.
if (true) {
var a = 1; // видна во всей функции
let b = 2; // только в блоке
}
console.log(a); // 1
console.log(b); // ReferenceErrorПо типу значения
- Примитивы — по значению, иммутабельны, копия независима.
- Ссылочные (объекты) — по ссылке, копия делит объект.
let x = { v: 1 };
let y = x; // общая ссылка
y.v = 9;
x.v; // 9Как это влияет на код
varпорождает утечки из блоков и баги hoisting → используютlet/const.constзащищает ссылку, но не содержимое объекта.- Ссылочные переменные требуют клонирования для независимой копии.
Коротко для собеседования
Переменные различаются объявлением (var — функциональная область/hoisting, let/const — блочная/TDZ, const без переприсваивания) и типом значения (примитив по значению vs объект по ссылке). Это влияет на области видимости, баги hoisting и копирование данных.