04. Array Destructing

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

  • Синтаксис паттерна деструкции массива можно использовать для любой итерируемоей сущности, не только для массива (строки, например).

  • Если итерируемый объект не содержит Symbol.iterator, то будет выброшено исключение TypeError.

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

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

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

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

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

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

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

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

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

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

Last updated