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

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

4 min read JavaScript Обновлено 22 Dec 2025
Деструктуризация в JavaScript: массивы и объекты
Деструктуризация в JavaScript: массивы и объекты

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

Что такое деструктуризация

Деструктуризация в JavaScript — это синтаксический сахар для «распаковки» значений из массивов или объектов и присвоения их переменным в одной строке. Коротко: вместо многострочных обращений по индексам или ключам вы записываете шаблон, который соответствует структуре данных.

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

Важно: сам процесс не создаёт «магии» — он просто читает существующие значения и присваивает их новым именам.

Почему это важно

  • Улучшает читаемость и уменьшает шаблонный код.
  • Часто используется в современных фреймворках (React, Vue, Angular) и в коде с функциями, возвращающими кортежи/объекты.
  • Позволяет задать значения по умолчанию, переименовать поля и собрать остаток через rest.

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

Простейший пример:

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];

Примеры и приёмы:

  • Оставшиеся элементы в переменной через 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, b = 'not provided'] = arr;
console.log(a); // 1
console.log(b); // 'not provided'
  • Частая полезная комбинация — распаковка результата Date().split(‘ ‘):
const [day, month, date, year, time, timezone] = String(new Date()).split(' ');
console.log(day); // 'Mon' (в англоязычной среде)
  • Вложенная деструктуризация для вложенных массивов:
const nested = [1, [2, 3], 4];
const [x, [y, z], w] = nested;

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

Объекты деструктурируются по именам свойств, порядок не важен:

const person = { name: 'Alvin', age: 10, height: 1 };
const { name, age, height } = person;
console.log(name);
  • Переименование поля при извлечении:
const { name: firstName, age: years } = person;
console.log(firstName); // 'Alvin'
  • Значения по умолчанию при отсутствии свойства:
const { location = 'Worldwide' } = person;
console.log(location); // 'Worldwide'
  • Оператор rest для объектов (функционирует только в конце паттерна):
const { name, ...rest } = person;
console.log(rest); // { age: 10, height: 1 }
  • Вложенная деструктуризация объектов:
const data = { id: 1, meta: { createdBy: 'admin', tags: ['a', 'b'] } };
const { meta: { createdBy, tags: [firstTag] } } = data;

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

const obj = {};
const { meta: { createdBy } = {} } = obj; // безопасно — meta будет {}

Практические сценарии использования

  • Деструктуризация параметров функции (часто в React-компонентах и API-функциях):
function setup({ host = 'localhost', port = 80, secure = false } = {}) {
  // host, port, secure доступны как локальные переменные
}
  • Возврат нескольких значений из функции в виде массива или объекта:
function parseCsv(line) {
  // возвращаем [id, fields]
  return [id, fields];
}
const [id, fields] = parseCsv(line);
  • Быстрая замена значений двух переменных (без временной переменной):
let a = 1, b = 2;
[a, b] = [b, a];
  • Деструктуризация props в React:
function Button({ label, onClick, disabled = false }) {
  return ;
}

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

  • Пытаться деструктурировать null или undefined:
const obj = null;
const { a } = obj; // TypeError: Cannot destructure property 'a' of 'obj' as it is null

Всегда проверяйте или задавайте значение по умолчанию для аргумента:

function fn(config = {}) {
  const { a } = config;
}
  • Проблема с именами полей: деструктуризация по ключу, поэтому опечатка приведёт к undefined.
  • rest для объектов должен стоять в конце — иначе синтаксическая ошибка.

Контрпримеры — когда деструктуризация может навредить

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

Альтернативы

  • Классический доступ через индекс/ключ: arr[0], obj.key — проще понять в простых случаях.
  • Библиотеки вроде lodash.get для безопасного доступа к вложенным полям.
  • TypeScript: деструктуризация вместе с аннотациями типов даёт сильную проверку на этапе компиляции.

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

  • Смотрите на деструктуризацию как на шаблон, который «соответствует» форме данных.
  • Применяйте деструктуризацию для локальных преобразований и в местах, где она повышает читаемость.
  • Избегайте чрезмерной вложенности: если нужно много уровней — лучше присвоить промежуточные переменные.

Чек‑листы по ролям

  • Для разработчика:

    • Использовал деструктуризацию там, где она улучшает выражение намерения.
    • Проверил поведение при отсутствии полей (значения по умолчанию).
    • Не разрушил публичный контракт (названия полей).
  • Для ревьюера:

    • Требование понятности: можно ли понять код без контекста?
    • Нет ли слишком глубокой вложенности или скрытых побочных эффектов?
    • Есть ли тесты, покрывающие крайние случаи (undefined, null)?

Шпаргалка: синтаксис (cheat sheet)

// Массивы
const [x, y, ...rest] = arr;
const [a = 10, b] = arr; // значения по умолчанию

// Объекты
const { key, nested: { prop } = {}, aliasName } = obj;
const { name: firstName, ...others } = person;

// Функция с деструктуризацией параметров
function init({ host = 'localhost', port = 80 } = {}) {}

// Обмен значениями
[a, b] = [b, a];

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

  • Код использует деструктуризацию там, где это улучшает читаемость и уменьшает повторение.
  • Обработаны случаи, когда источник данных может быть undefined/null.
  • В публичных интерфейсах изменения имён полей задокументированы и совместимы.
  • Тесты покрывают поведение при отсутствии свойств/элементов.

Быстрые рекомендации по производительности

Деструктуризация в большинстве приложений не является узким местом. Если вы профилируете и видите реальную потерю, замените критичные места на прямой доступ по индексу или ключу.

Примеры из реальной разработки

  • В React часто используют деструктуризацию props и state для лаконичности и ясности.
  • В утилитах парсинга CSV/логов деструктуризация массива возвращаемых значений делает код компактнее.

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

Деструктуризация — мощный и выразительный инструмент JavaScript, который делает код короче и понятнее, если применять её осознанно. Используйте значения по умолчанию и rest, избегайте слишком глубокой вложенности и не забывайте об обработке null/undefined.

Важно: не меняйте публичные имена полей без внимания к обратной совместимости.


Факты

  • Деструктуризация была введена в спецификации ECMAScript 2015 (ES6).
  • Работает одинаково в браузерах современных версий и в Node.js (совместимость зависит от версии среды).

Авторская заметка: используйте деструктуризацию как инструмент читаемости, а не как трюк — если код становится менее очевидным, вернитесь к простому доступу по ключу или индексу.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

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

Создать pitch deck в Google Slides быстро
Презентации

Создать pitch deck в Google Slides быстро

Открыть ZIP‑файлы на Mac — способы и советы
macOS

Открыть ZIP‑файлы на Mac — способы и советы

Как включить двухфакторную аутентификацию в Asana
Безопасность

Как включить двухфакторную аутентификацию в Asana

Анализ локальных документов с LangChain и OpenAI
Инструменты ML

Анализ локальных документов с LangChain и OpenAI

Как ускорить старый iPhone: проверенные приёмы
Мобильные устройства

Как ускорить старый iPhone: проверенные приёмы

Посмотреть открытые ссылки в Instagram
Социальные сети

Посмотреть открытые ссылки в Instagram