← Все вопросы

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

Задан 5 дней назад377 просмотров2 ответа
6

Часто встречаю в коде записи вроде const { name, age } = user и const [first, second] = arr. Понимаю, что это как-то достаёт значения, но не знаю всех возможностей: можно ли задать значение по умолчанию, переименовать поле или собрать «остаток»? Объясните, пожалуйста, с примерами.

2 ответа

7
✓ Принятый ответ — помог автору

Деструктуризация — это синтаксис, который «распаковывает» значения из массива или объекта в отдельные переменные. Разберём все приёмы.

Массив (по позиции):

const arr = [10, 20, 30];
const [a, b] = arr;       // a=10, b=20
const [, , third] = arr;  // пропуск: third=30

Объект (по имени ключа):

const user = { name: 'Аня', age: 25 };
const { name, age } = user; // name='Аня', age=25

Значения по умолчанию — если поля/элемента нет:

const { city = 'не указан' } = user; // city='не указан'
const [x = 0, y = 0] = [5];           // x=5, y=0

Переименование (только для объектов, через :):

const { name: userName } = user; // userName='Аня'

Rest ... — собрать остаток:

const [head, ...tail] = [1, 2, 3, 4]; // head=1, tail=[2,3,4]
const { name: n, ...rest } = user;    // rest={ age: 25 }

Обмен переменных без временной:

let p = 1, q = 2;
[p, q] = [q, p]; // p=2, q=1

В параметрах функции — очень удобно для «именованных» аргументов:

function greet({ name, greeting = 'Привет' }) {
  return `${greeting}, ${name}!`;
}
greet({ name: 'Иван' }); // 'Привет, Иван!'

Почему это полезно: меньше шумного obj.field.field, понятнее видно, какие именно поля используются, и значения по умолчанию защищают от undefined.

2

Добавлю пару грабель, на которые легко наступить.

  1. Деструктуризация объекта в уже объявленные переменные требует скобок, иначе { воспринимается как начало блока:
let name;
({ name } = user); // скобки обязательны
  1. Если деструктурируешь null или undefined — будет ошибка Cannot destructure .... Спасает дефолт для всего объекта:
function f({ a } = {}) { return a; }
f(); // undefined, а не падение

Ваш ответ

Войдите, чтобы ответить на вопрос.
Поддержать проект