Деструктуризация
Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.
Деструктуризация — короткая запись для распаковки данных: слева от = вы рисуете узор, похожий на массив или объект, и значения сами разбегаются по переменным. Одна строка вместо пяти обращений через точку и индекс — и код начинает читаться как опись содержимого.
Обычный способ достать данные из массива — обращаться по индексам: scores[0], scores[1]. Деструктуризация переворачивает запись: вы описываете слева ту же форму, что и справа, а движок раскладывает значения по местам.
Лишние элементы просто игнорируются, а если переменных больше, чем элементов, недостающим достанется undefined — без всякой ошибки. Ненужную позицию можно пропустить, оставив пустое место между запятыми, а весь хвост — собрать в отдельный массив через ....
Справа не обязан стоять массив — подойдёт любое перебираемое значение. Из строки "да" узор [a, b] достанет буквы: "д" и "а".
У объекта нет порядка — у него есть имена. Поэтому узор пишут в фигурных скобках, а переменные называют так же, как ключи.
Порядок внутри фигурных скобок не значит ничего: { city, name } и { name, city } работают одинаково. А вот отсутствующий ключ тихо превращается в undefined — это самый частый источник недоумения, когда данные пришли не в том виде, что ожидали.
Чтобы пропущенный ключ не оборачивался undefined, значение по умолчанию пишут прямо в узоре через =. Работает это и для массивов, и для объектов.
Имя переменной не обязано совпадать с ключом. Двоеточие читается как «взять этот ключ и положить под этим именем»: слева ключ объекта, справа — ваша переменная. Умолчание дописывается в конец, после нового имени.
Значение по умолчанию подставляется только вместо undefined. null, 0, пустая строка — полноценные значения, и заменять их никто не станет. Если сервер присылает null для «ничего», умолчания вас не спасут.
Узор повторяет форму данных на любой глубине: внутрь фигурных скобок вкладываются фигурные, внутрь квадратных — квадратные. Это особенно удобно с ответами API, где нужное поле лежит через три уровня.
Важная деталь: переменной client в примере выше не появилось. Всё, что стоит слева от двоеточия, — только маршрут к данным; настоящими переменными становятся лишь имена на концах узора. Если нужен и объект целиком, и его поле, упомяните ключ дважды.
Самое частое применение деструктуризации — параметры функции. Когда аргументов много и половина необязательна, объект настроек читается лучше позиционного списка: на вызове видно, что означает каждое значение, и порядок больше не нужно помнить.
Одна ловушка: вызовите такую функцию совсем без аргументов — и разбирать будет нечего, получите ошибку «Cannot destructure property». Лечится умолчанием для всего параметра: = {} в конце.
Раз слева стоит узор, а справа — обычное выражение, обмен двух переменных умещается в строку: справа собирается временный массив, слева он тут же разбирается обратно. Временная переменная tmp больше не нужна.
Здесь стоит помнить про точку с запятой. Строка начинается с квадратной скобки, и если предыдущая строка её не закрыла, движок склеит две строки в обращение по индексу — получится загадочная ошибка. Заканчивайте предыдущую строку ; или начинайте эту с ;[a, b] = [b, a];.
С объектом тот же трюк требует круглых скобок: строка, начатая с {, воспринимается как блок кода, а не как узор. Скобки заставляют движок читать выражение.
- Деструктуризация — узор слева от =, повторяющий форму данных: квадратные скобки для массива (по позициям), фигурные для объекта (по именам ключей).
- Нехватка данных не ошибка: недостающие переменные получают undefined; чтобы это исправить, пишут значение по умолчанию через = прямо в узоре.
- Умолчание срабатывает только вместо undefined — null, 0 и пустая строка остаются как есть.
- Двоеточие переименовывает: слева ключ объекта, справа имя переменной. Имена в конце вложенного узора становятся переменными, промежуточные — только маршрут.
- Классические применения: параметры функции с настройками (не забудьте = {} для вызова без аргументов) и обмен значений строкой [a, b] = [b, a].
1/3Что окажется в переменной a: const { a = 5 } = { a: null };
2/3Что выведет console.log(y) после строки const [x, y] = [10];
3/3Какие переменные создаст строка const { name: title } = { name: "Кофе" };
Функция с объектом настроек
Перепишите параметр функции cardInfo на деструктуризацию: title по умолчанию «без названия», width — 300, theme — «light». Вызов вообще без аргументов не должен ломаться.
Все три умолчания живут прямо в узоре, а = {} в конце спасает вызов без аргументов: разбирать будет пустой объект, и каждое поле возьмёт своё умолчание.
Разобрать ответ сервера
Одной строкой достаньте из response имя пользователя под именем userName, его город и второй товар списка. Первый товар пропустите — переменная для него не нужна.
Узор повторяет форму ответа: data и user — только маршрут, переменными становятся имена на концах. Ключ name переименован в userName, а первый элемент массива пропущен пустым местом перед запятой.