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
Was this helpful?