> For the complete documentation index, see [llms.txt](https://strctr.gitbook.io/programming/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://strctr.gitbook.io/programming/01-languages/javascript/01-language/b-structured/b3-destructing/02-destructing-pattern.md).

# 02. Destructing Pattern

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

* Можно указывать только те значения из структуры, которые нужны:
  * конкретные ключи объекта;
  * первые элементы массива.
* Перед деструкцией значение справа приводится к объекту при помощи системной функции `ToObject`.
* Если переменная справа имеет значение `null` или `undefined` будет выброшено исключение `TypeError`.
* Деструкция извлекает как данные так и методы.
* Деструкция извлекает данные даже если они находятся в цепочке прототипов.
* К каждому имени может быть указано значение по умолчанию после знака `=`.
* Каждое имя можно переименовать указав после имени в паттерне двоеточие и новое имя.
* Если паттерн не совпадает со структурой в каких-либо частях, то пропущенные имена получают значение `undefined`.

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

## Default Values

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

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

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

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

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

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

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

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

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

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

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

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

## Assign on destructing

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

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

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