# 04. Array Destructing

* Деструкция на массивах использует итератор для получения элементов массива.
* Синтаксис паттерна деструкции массива можно использовать для любой итерируемоей сущности, не только для массива (строки, например).
* Если итерируемый объект не содержит `Symbol.iterator`, то будет выброшено исключение `TypeError`.

В массивах можно пропускать элементы оставляя дыры в паттерне:

```javascript
let [, , x] = ["a", "b", "c", "d"]; // x = 'c'
```

**Оператор rest** - записывает последующие значения объекта или массива при деконструкции в параметр, который получит “всё остальное”, при помощи оператора `...`:

```javascript
let [firstName, lastName, ...rest] = "Юлий Цезарь Император Рима".split(" ");

console.log(firstName); // Юлий
console.log(lastName); // Цезарь
console.log(rest); // Император Рима
```

Значением `rest` будет массив из оставшихся элементов массива. Вместо `rest` можно использовать и другое имя переменной, оператор здесь — троеточие. Оно должно стоять только последним элементом в списке слева. Если значению `rest` не соответствует ни один из элемент, то по умолчанию используется пустой массив. Таким образом `rest` никогда не принимает значения `null` или `undefined`.

Значением `rest` не обязательно должна быть переменная, это так же может быть и паттерн:

```javascript
let [x, ...[y, z]] = ["a", "b", "c"];
// x = 'a'; y = 'b'; z = 'c'
```

Деструктуризация также работает с бесконечными массивами:

```javascript
function* allNaturalNumbers() {
  for (let n = 0; ; n++) {
    yield n;
  }
}
let [x, y, z] = allNaturalNumbers(); // x=0; y=1; z=2
```
