Гид по технологиям

Деструктуризация объектов и массивов в JavaScript

5 min read JavaScript Обновлено 08 Apr 2026
Деструктуризация в JavaScript — объекты и массивы
Деструктуризация в JavaScript — объекты и массивы

Ноутбук на столе, на экране редактор кода с тёмной темой.

Что такое деструктуризация объектов и массивов в JavaScript?

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

Определение термина: деструктуризация — способ присвоить отдельным переменным значения из коллекций (массивов/объектов) за одну операцию.

Почему это важно: современные фреймворки (React, Angular, Vue) активно используют этот паттерн при работе с props, состоянием и ответами API.

Как деструктурировать массивы

Простейший пример показывает идею:

const arr = [1, 2];
const [a, b] = arr;
console.log(a)  // выводит 1
console.log(b)  // выводит 2

Под капотом это эквивалентно присвоению по индексам:

const arr = [1,2];
const a = arr[0];
const b = arr[1];

Деструктуризация особенно удобна, когда функция возвращает массив или когда вы работаете с последовательностями, полученными из строки:

const [day, month, date, year, time, timezone] = Date().split(' ')

// Вызов Date() возвращает текущую дату в формате:
// Mon Feb 20 2023 13:07:29 GMT+0000
console.log(day)  // выводит Mon
console.log(month)  // выводит Feb
console.log(date)  // выводит 20

Важно помнить несколько правил и паттернов при деструктуризации массивов:

  • Если в массиве больше элементов, чем переменных — лишние элементы игнорируются.
const arr = [1, 2, 3, 4];
const [a, b] = arr;
console.log(a)  // 1
console.log(b)  // 2
// значения 3 и 4 не присваиваются
  • Чтобы собрать остаток элементов, используется оператор rest:
const arr = [1, 2, 3, 4];
const [a, b, ...rest] = arr;
console.log(rest)  // [3, 4]
  • Можно пропускать элементы, используя пустые позиции через запятую:
const arr = [1, 2, 3, 4];
const [a, , c] = arr;
console.log(c) // 3
  • Если переменных больше, чем элементов в массиве, лишние переменные получат значение undefined. Чтобы избежать этого, задайте значения по умолчанию:
const arr = [1];
const [a = '10', b = 'not provided'] = arr;
console.log(a)  // 1
console.log(b)  // "not provided"

Важно: значения по умолчанию применяются только когда распаковываемое значение строго равно undefined.

Как деструктурировать объекты

С массивами всё основано на позициях, а с объектами — на именах свойств. Пример базовой деструктуризации объекта:

const person = {name: 'Alvin', age: 10, height: 1};
const {name, age, height} = person;
console.log(name) // 'Alvin'
console.log(height) // 1

Если нужно сохранить значение в переменную с другим именем — используйте двоеточие:

const person = {name: 'Alvin', age: 10, height: 1};
const {name: firstName, age: years, height: currentHeight} = person;
console.log(firstName)  // 'Alvin'
console.log(currentHeight)  // 1

Значения по умолчанию для объектов работают так же, как и для массивов:

const person = {name: 'Alvin', age: 10, height: 1};
const {name, age, height, location = 'Worldwide'} = person;
console.log(name)  // 'Alvin'
console.log(location)  // 'Worldwide'

Порядок свойств при деструктуризации не важен, потому что обращение идёт по ключам:

const person = {name: 'Alvin', age: 10, height: 1};
const {age, height, name} = person;
console.log(name)  // 'Alvin'
console.log(height)  // 1

Также доступен оператор rest для объектов (он всегда должен быть последним):

const person = {name: 'Alvin', age: 10, height: 1};
const {name, ...rest} = person;
console.log(name)  // 'Alvin'
console.log(rest)  // { age: 10, height: 1 }

Если поставить rest не последним, JS выбросит исключение.

Практические советы и паттерны

  • Используйте деструктуризацию для извлечения конкретных полей из API-ответов, чтобы избежать многократного обращения к одному объекту.
  • При больших объектах или ответах от внешних API комбинируйте деструктуризацию с проверками наличия полей (через опциональную цепочку ?. или валидацию схемы).
  • Для возвращаемых значений функций, которые могут вернуть ошибку, возвращайте объект с полями { data, error } и применяйте деструктуризацию: const { data, error } = await fetchData();
  • В React-hook useState можно распаковать массив-результат: const [state, setState] = useState(initial);

Пример обмена значений через деструктуризацию — коротко и удобно:

let x = 1;
let y = 2;
[x, y] = [y, x];
console.log(x, y) // 2 1

Когда деструктуризация не подходит (контрпримеры)

  • Если структура данных непредсказуема и может менять типы или наличие полей, деструктуризация без предварительной проверки приведёт к undefined или ошибкам.
  • Для больших вложенных объектов с множеством уровней иногда удобнее использовать безопасные селекторы (getters) или библиотеки типа lodash.get.
  • В ситуациях, где важна производительность в горячих циклах, множественные деструктуризации могут быть чуть медленнее прямого обращения по индексу/ключу (хотя для большинства приложений разница незначительна).

Альтернативные подходы

  • Явное присваивание через свойства/индексы: const a = arr[0]; const name = person.name;
  • Использование утилитных функций: const name = _.get(obj, ‘user.profile.name’, defaultValue);
  • ORM/сериализаторы и схемы валидации (Joi, Yup) для надёжной нормализации данных перед деструктуризацией.

Ментальные модели и эвристики

  • “Именованные поля — объекты, позиционные — массивы”: если значение важно по порядку — массив, если по семантике — объект.
  • “Деструктуризация = декларация ожиданий”: деструктурируя, вы описываете, какие поля/элементы вас интересуют.
  • Всегда задавайте значения по умолчанию, если источник данных ненадёжен.

Контроль качества: тесты и критерии приёмки

Критерии приёмки:

  • Код корректно распаковывает требуемые поля при валидных данных.
  • При отсутствии полей используются предусмотренные значения по умолчанию или возвращается понятная ошибка.
  • Рефакторинг с деструктуризацией не ухудшил читаемость; код покрыт тестами.

Минимальные тест-кейсы:

  1. Веерный кейс: данные полные — все переменные получают ожидаемые значения.
  2. Частичные данные: некоторые поля отсутствуют — проверьте значения по умолчанию.
  3. Некорректный тип: источник возвращает не объект/массив — обработка ошибки.
  4. Производительность: для горячей функции — замер времени до и после рефакторинга (при необходимости).

Чек-лист для разных ролей

Разработчик:

  • Прописал значения по умолчанию, если источник ненадёжен.
  • Не деструктурировал глубоко вложенные поля без проверки.
  • Написал unit-тесты для крайних случаев.

Код-ревьюер:

  • Проверил, что деструктуризация повышает читаемость.
  • Убедился, что rest-параметры используются корректно.
  • Проверил, что нет побочных эффектов при undefined.

Технический писатель:

  • Документировал ожидания от структуры данных (schema shape).
  • Добавил примеры использования в README или в комментариях.

Глоссарий

  • Деструктуризация: распаковка значений из коллекции в переменные.
  • Rest (оператор …): собирает оставшиеся элементы в массив или объект.
  • Значение по умолчанию: значение, применяемое если распаковываемое значение === undefined.

Частые ошибки и подводные камни

  • Ожидание, что дефолт сработает для null — не сработает (работает только для undefined).
  • Путают порядок для массивов — будьте внимательны при смене структуры.
  • Попытка использовать rest не в конце приводит к SyntaxError.

Примеры расширенного использования

Деструктуризация в параметрах функции:

function createUser({ name = 'Guest', role = 'reader' } = {}) {
  return { name, role };
}

console.log(createUser({ name: 'Anna' })) // { name: 'Anna', role: 'reader' }
console.log(createUser()) // { name: 'Guest', role: 'reader' }

Деструктуризация с вложенностью и опциональной цепочкой:

const response = { user: { profile: { name: 'Sam' } } };
const { user: { profile: { name } = {} } = {} } = response;
console.log(name) // 'Sam'

// Альтернатива с безопасным доступом:
const safeName = response.user?.profile?.name ?? 'Unknown';

Краткое резюме

Деструктуризация делает код короче и яснее, когда вы точно знаете структуру данных. Всегда комбинируйте её с валидацией и значениями по умолчанию при работе с ненадёжными источниками. Используйте чек-листы и простые тесты, чтобы избежать ошибок в граничных ситуациях.

Подведём итоги:

  • Применяйте деструктуризацию для улучшения читаемости.
  • Используйте значения по умолчанию и проверки для надёжности.
  • Помните ограничения — в некоторых случаях явное обращение к полям предпочтительнее.
Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Как сохранить и найти вакансии на LinkedIn
Карьера

Как сохранить и найти вакансии на LinkedIn

Связать Alexa с Fire TV — быстро и надежно
Гаджеты

Связать Alexa с Fire TV — быстро и надежно

Как не подхватить вредоносное ПО через Facebook
Интернет-безопасность

Как не подхватить вредоносное ПО через Facebook

Как поделиться Google Drive с не‑Gmail аккаунтом
Гайды

Как поделиться Google Drive с не‑Gmail аккаунтом

Обрезка фото по форме в Photoshop
Photoshop

Обрезка фото по форме в Photoshop

Виртуальные окружения Python: создание и управление
Python

Виртуальные окружения Python: создание и управление