01. Destructing

Деструктуризация - это механизм, позволяющий извлекать данные, хранящиеся в (потенциально вложенной) структуре данных. Деструктуризация основана на описания паттернов, применяемых к структуре данных для извлечения её частей. Деструкция применяется для массивов и объектов.

Лексически, деструктуризация выполняется на присваивание (destructing assignment) — это особый синтаксис присваивания, при котором можно присвоить массив или объект сразу нескольким переменным, разбив его на части. Основная цель выражений деструктуризации - извлечь множество данных из какой-либо структуры данных за один заход.

Выражение деструктуризации состоит из:

  • Destructing source - разбиваемая структура данных

  • Destructing target - паттерн разбиения, формирующий несколько идентификаторов по которым доступны результаты разбиения.

    • Паттерн присваивания x

    • Паттерн объекта { first: «pattern», last: «pattern» }

    • Паттерн массива [ «pattern», «pattern» ] работает как и массивами, так и с любыми итерируемыми структурами.

Деструктуризация может быть применена к следующим сущностям:

  • Объекты

  • Массивы

  • Строки (как массив символов)

  • Генераторы (как массив последовательных значений, возвращаемых генератором)

  • Коллекции (как массив последовательных значений, возвращаемых итератором)

Деструктуризация может находится:

  • В любом месте где допустимо присваивание

  • В параметрах функций

Usage

Пример паттерна деструктуризации объекта:

const obj = { foo: 123 };
const { foo } = obj;

Пример паттерна деструктуризации массива:

let arr = ["a", "b"];
let [x, y] = arr;

Паттерны можно комбинировать и вкладывать друг в друга не ограниченно:

const obj = { a: [{ foo: 123, bar: "abc" }, {}], b: true };
const {
  a: [{ foo: f }]
} = obj; // f = 123

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

const [d, e] = "de";

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

const fn = ({ a, x, y }, [c, d]) => {
  return;
  a === 1 && x === 2 && c === 3 && d === 4 && y === undefined;
};

fn({ a: 1, x: 2 }, [3, 4]);

Деструктуризация при возвращении структуры из функции.

const [all, year, month, day] = /^(\d\d\d\d)-(\d\d)-(\d\d)$/.exec("2999-12-31");

Деструктуризация в циклах:

const arr1 = ["a", "b"];
for (let [index, element] of arr1.entries()) {
  console.log(index, element);
}

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

const map = new Map([
  [false, "no"],
  [true, "yes"]
]);
for (const [key, value] of map) {
  console.log(key + " is " + value);
}

Деконструкция генераторов

const [a, b, c] = (function*() {
  yield 1;
  yield 2;
})();
const [d, e] = (function*() {
  yield 3;
  yield 4;
})();
return a === 1 && b === 2 && c === undefined && d === 3 && e === 4;

Last updated