Переменные в JavaScript
Область видимости и мутация
Три способа объявить переменную
В современном JavaScript используются const и let. var остался в старом коде и в новых проектах не нужен — ниже объясню почему.
const name = "Сергей";
let count = 0;
count = count + 1; // можно
const против let
const запрещает переприсваивание, let разрешает. Правило простое: по умолчанию пишите const, а на let меняйте только тогда, когда значение действительно меняется — счётчик цикла, аккумулятор, результат поиска.
Важно: const не делает объект неизменяемым. Ссылку переписать нельзя, а содержимое — можно:
const user = { name: "Анна" };
user.name = "Мария"; // работает
user = {}; // ошибка
Область видимости
let и const видны только внутри блока, где объявлены — в фигурных скобках:
if (true) {
let local = 1;
}
console.log(local); // ReferenceError
var игнорирует блок и виден во всей функции. Из-за этого переменная из цикла «протекает» наружу, и ошибку потом ищут часами.
Поднятие (hoisting)
var поднимается в начало функции и на момент обращения равен undefined. let и const тоже поднимаются, но до объявления находятся в «мёртвой зоне» и дают ReferenceError — это лучше, потому что ошибка видна сразу, а не превращается в тихий undefined.
Типы значений
- Примитивы — строка, число, булево,
null,undefined,symbol,bigint. Копируются по значению. - Объекты и массивы — копируются по ссылке. Две переменные могут указывать на один объект.
- Проверить тип:
typeof value. Для массивов используйтеArray.isArray().
Копирование объектов
Чтобы получить независимую копию, используют оператор расширения. Но он делает поверхностную копию: вложенные объекты остаются общими.
const copy = { ...user, age: 30 };
const arr2 = [...arr];
Для глубокого копирования — structuredClone(obj) в современных браузерах.
Частые ошибки
- Объявление через var по привычке. Теряется блочная область видимости, появляются случайные глобальные переменные.
- Уверенность, что const защищает объект. Защищает только ссылку.
- Мутация при копировании.
const copy = user— это не копия, а второе имя того же объекта. - Неявные глобальные переменные. Присваивание без объявления создаёт переменную в глобальной области и ломает изоляцию.
Нужен сайт, а не статья?
Напишу фронтенд без лишних зависимостей: интерактив, формы, запросы к API. С 2009 года, по договору, с поддержкой после запуска.
Полезно по теме: JavaScript с нуля, про React, примеры HTML.