Деструктуризация

коллекции≈ 7 минут

Здесь будет встроен видео-разбор темы (5–7 минут, YouTube / RuTube / VK Видео) — тем, кто лучше воспринимает на слух, текст ниже не обязателен.

Деструктуризация — короткая запись для распаковки данных: слева от = вы рисуете узор, похожий на массив или объект, и значения сами разбегаются по переменным. Одна строка вместо пяти обращений через точку и индекс — и код начинает читаться как опись содержимого.

Разделы темы:·

Обычный способ достать данные из массива — обращаться по индексам: scores[0], scores[1]. Деструктуризация переворачивает запись: вы описываете слева ту же форму, что и справа, а движок раскладывает значения по местам.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Лишние элементы просто игнорируются, а если переменных больше, чем элементов, недостающим достанется undefined — без всякой ошибки. Ненужную позицию можно пропустить, оставив пустое место между запятыми, а весь хвост — собрать в отдельный массив через ....

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Справа не обязан стоять массив — подойдёт любое перебираемое значение. Из строки "да" узор [a, b] достанет буквы: "д" и "а".

У объекта нет порядка — у него есть имена. Поэтому узор пишут в фигурных скобках, а переменные называют так же, как ключи.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Порядок внутри фигурных скобок не значит ничего: { city, name } и { name, city } работают одинаково. А вот отсутствующий ключ тихо превращается в undefined — это самый частый источник недоумения, когда данные пришли не в том виде, что ожидали.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Чтобы пропущенный ключ не оборачивался undefined, значение по умолчанию пишут прямо в узоре через =. Работает это и для массивов, и для объектов.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Имя переменной не обязано совпадать с ключом. Двоеточие читается как «взять этот ключ и положить под этим именем»: слева ключ объекта, справа — ваша переменная. Умолчание дописывается в конец, после нового имени.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Значение по умолчанию подставляется только вместо undefined. null, 0, пустая строка — полноценные значения, и заменять их никто не станет. Если сервер присылает null для «ничего», умолчания вас не спасут.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Узор повторяет форму данных на любой глубине: внутрь фигурных скобок вкладываются фигурные, внутрь квадратных — квадратные. Это особенно удобно с ответами API, где нужное поле лежит через три уровня.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Важная деталь: переменной client в примере выше не появилось. Всё, что стоит слева от двоеточия, — только маршрут к данным; настоящими переменными становятся лишь имена на концах узора. Если нужен и объект целиком, и его поле, упомяните ключ дважды.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Самое частое применение деструктуризации — параметры функции. Когда аргументов много и половина необязательна, объект настроек читается лучше позиционного списка: на вызове видно, что означает каждое значение, и порядок больше не нужно помнить.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Одна ловушка: вызовите такую функцию совсем без аргументов — и разбирать будет нечего, получите ошибку «Cannot destructure property». Лечится умолчанием для всего параметра: = {} в конце.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Раз слева стоит узор, а справа — обычное выражение, обмен двух переменных умещается в строку: справа собирается временный массив, слева он тут же разбирается обратно. Временная переменная tmp больше не нужна.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Здесь стоит помнить про точку с запятой. Строка начинается с квадратной скобки, и если предыдущая строка её не закрыла, движок склеит две строки в обращение по индексу — получится загадочная ошибка. Заканчивайте предыдущую строку ; или начинайте эту с ;[a, b] = [b, a];.

С объектом тот же трюк требует круглых скобок: строка, начатая с {, воспринимается как блок кода, а не как узор. Скобки заставляют движок читать выражение.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

  • Деструктуризация — узор слева от =, повторяющий форму данных: квадратные скобки для массива (по позициям), фигурные для объекта (по именам ключей).
  • Нехватка данных не ошибка: недостающие переменные получают 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». Вызов вообще без аргументов не должен ломаться.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Все три умолчания живут прямо в узоре, а = {} в конце спасает вызов без аргументов: разбирать будет пустой объект, и каждое поле возьмёт своё умолчание.

jsлистинг · не запускается
Листинг только для чтения: этот код не запускается в браузере.

Разобрать ответ сервера

Одной строкой достаньте из response имя пользователя под именем userName, его город и второй товар списка. Первый товар пропустите — переменная для него не нужна.

js
Tab добавляет отступ. Чтобы выйти из редактора, нажмите Escape — фокус перейдёт на кнопку запуска.

Узор повторяет форму ответа: data и user — только маршрут, переменными становятся имена на концах. Ключ name переименован в userName, а первый элемент массива пропущен пустым местом перед запятой.

jsлистинг · не запускается
Листинг только для чтения: этот код не запускается в браузере.