02. Destructing Pattern

Каждый паттерн деструкции содержит одну или несколько имен переменных:

  • Можно указывать только те значения из структуры, которые нужны:

    • конкретные ключи объекта;

    • первые элементы массива.

  • Перед деструкцией значение справа приводится к объекту при помощи системной функции ToObject.

  • Если переменная справа имеет значение null или undefined будет выброшено исключение TypeError.

  • Деструкция извлекает как данные так и методы.

  • Деструкция извлекает данные даже если они находятся в цепочке прототипов.

  • К каждому имени может быть указано значение по умолчанию после знака =.

  • Каждое имя можно переименовать указав после имени в паттерне двоеточие и новое имя.

  • Если паттерн не совпадает со структурой в каких-либо частях, то пропущенные имена получают значение undefined.

// Only needed keys
const { x } = { x: 7, y: 3 }; // x = 7
const { toString: s } = 123;

Default Values

Объявлениям в паттерне можно задавать значение по умолчанию:

// значения по умолчанию
let [firstName = "Гость", lastName = "Анонимный"] = [];

alert(firstName); // Гость
alert(lastName); // Анонимный

let { foo = 3, bar } = {}; // x = 3; y = undefined

Параметр по умолчанию так же используется, если само значение в структуре равно undefined (это еще лишний раз доказывает, что значениям undefined не место в программе):

const [x = 1] = [undefined]; // x = 1
const { prop: y = 2 } = { prop: undefined }; // y = 2

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

let { prop: y = someFunc() } = someValue;

Значение по умолчанию может ссылаться на другой идентификатор в этом же паттерне, объявленный ранее.

let [x = 3, y = x] = []; // x=3; y=3

Значением по умолчанию для паттерна может быть объект, к которому данный паттерн должен быть применен, если он не был применен в целевой структуре данных. Например:

// No value for pattern at pos 0
let [{ prop: x } = {}] = [];
// Destructuring continues with default value
let { prop: x } = {}; // x = undefined

Assign on destructing

Если хочется присвоить свойство объекта в переменную с другим именем, то можно через двоеточие указать соответствие между именем при деструкции и новой переменной:

const obj = { first: "Jane", last: "Doe" };
const { first: f, last: l } = obj; // f = 'Jane'; l = 'Doe'

Для массивов имеет значение порядок, поэтому нельзя использовать переименование :, но значение по умолчанию — можно.

Last updated