20 лютого 2024 р.

Деструктуроване присвоєння

Двома найбільш вживаними структурами даних у JavaScript є Object та Array.

  • Об’єкти дозволяють нам створити єдину сутність, яка зберігатиме дані за ключем.
  • Масиви дозволяють нам зібрати елементи даних у впорядкований список.

Однак, коли ми передаємо їх у функцію, нам може знадобитися не все. Функції можуть знадобитися лише певні елементи або властивості.

Деструктуроване присвоєння – це спеціальний синтаксис, що дозволяє нам “розпаковувати” масиви чи об’єкти в купу змінних, оскільки іноді це зручніше.

Деструктурування також чудово працює зі складними функціями, які мають багато параметрів, типових значень тощо. Незабаром ми це побачимо.

Деструктурування масиву

Ось приклад того, як масив деструктурується на змінні:

// у нас є масив з іменем та прізвищем
let arr = ["Іван", "Петренко"]

// деструктуроване присвоєння
// встановлює firstName = arr[0]
// та surname = arr[1]
let [firstName, surname] = arr;

alert(firstName); // Іван
alert(surname);  // Петренко

Тепер ми можемо працювати зі змінними замість елементів масиву.

Це чудово виглядає в поєднанні зі split або іншими методами повернення масиву:

let [firstName, surname] = "Іван Петренко".split(' ');
alert(firstName); // Іван
alert(surname);  // Петренко

Як бачите, синтаксис простий. Хоча є кілька особливих деталей. Давайте розглянемо більше прикладів, щоб краще це зрозуміти.

“Деструктурування” не означає “руйнування”.

Це називається “деструктуроване присвоєння”, оскільки воно “деструктурує” шляхом копіювання елементів у змінні. Однак, сам масив не змінюється.

Це просто коротший спосіб написати:

// let [firstName, surname] = arr;
let firstName = arr[0];
let surname = arr[1];
Ігноруйте елементи за допомогою коми

Небажані елементи масиву також можна викинути за допомогою додаткової коми:

// другий елемент не потрібен
let [firstName, , title] = ["Юлій", "Цезар", "Консул", "Римської республіки"];

alert( title ); // Консул

У наведеному вище коді другий елемент масиву пропускається, третій присвоюється title, а решта елементів масиву також пропускаються (оскільки для них немає змінних).

Працює з будь-якими типами даних, що перебираються у правій стороні

…Насправді, ми можемо використовувати його з будь-якими даними, які перебираються, а не тільки з масивами:

let [a, b, c] = "abc"; // ["a", "b", "c"]
let [one, two, three] = new Set([1, 2, 3]);

Це працює, тому що внутрішньо деструктуроване присвоювання працює шляхом ітерації над правильним значенням. Це своєрідний синтаксичний цукор для виклику for..of над значенням праворуч від = і присвоювання значень.

Призначте будь-що з лівого боку

Ми можемо використовувати будь-які “призначення” з лівого боку.

Наприклад, властивість об’єкта:

let user = {};
[user.name, user.surname] = "Іван Петренко".split(' ');

alert(user.name); // Іван
alert(user.surname); // Петренко
Цикл з .entries()

У попередньому розділі, ми бачили метод Object.entries(obj).

Ми можемо використовувати його з деструктуруванням для циклічного перебору ключів-та-значень об’єкта:

let user = {
  name: "Іван",
  age: 30
};

// перебрати циклом ключі-та-значення
for (let [key, value] of Object.entries(user)) {
  alert(`${key}:${value}`); // name:Іван, потім age:30
}

Подібний код для Map простіший, оскільки він є структурою даних, яка перебирається:

let user = new Map();
user.set("name", "Іван");
user.set("age", "30");

// Map ітерує як пари [key, value], що дуже зручно для деструктурування
for (let [key, value] of user) {
  alert(`${key}:${value}`); // name:Іван, then age:30
}
Трюк обміну змінними

Існує відомий трюк для обміну значень двох змінних за допомогою деструктурованого присвоєння: