Деструктуризація
Деструктуризація, це спосіб дістати дані з масивів і об'єктів коротко й красиво, без зайвого коду. Замість кількох рядків з obj.prop ви одним виразом створюєте потрібні змінні, за іменами властивостей для об'єктів і за позицією для масивів.
Теорія
TL;DR
- Об'єкти деструктуризуються за іменами властивостей:
const { name, age } = user;. - Масиви, за позицією:
const [a, b] = arr;. - Змінну можна перейменувати:
const { name: userName } = user;. - Можна задати значення за замовчуванням:
const { city = 'Paris' } = user;. - Вкладені структури розбираються так само:
const { address: { city } } = user;. - Rest збирає решту:
const [first, ...rest] = arr;.
Швидкий приклад
До ES6 доводилося писати так:
const user = { name: 'Alex', age: 25 };
const name = user.name;
const age = user.age;
console.log(name, age); // Alex 25З ES6 те саме, але одним рядком:
const user = { name: 'Alex', age: 25 };
const { name, age } = user;
console.log(name, age); // Alex 25Тепер name і age автоматично створені як змінні з тими самими іменами, що й властивості об'єкта.
Деструктуризація об'єктів
Витягнути тільки потрібні властивості:
const { name } = user;
console.log(name); // AlexПерейменувати змінні:
const { name: userName, age: userAge } = user;
console.log(userName, userAge); // Alex 25Значення за замовчуванням спрацьовує, коли властивості немає або вона undefined:
const { city = 'Paris' } = user;
console.log(city); // ParisВкладені об'єкти розбираються тим самим синтаксисом:
const user = {
name: 'Alex',
address: { city: 'Paris', zip: 12345 }
};
const { address: { city, zip } } = user;
console.log(city, zip); // Paris 12345Деструктуризація масивів
Для масивів значення беруться за позицією, а не за іменем:
const arr = [10, 20, 30];
const [a, b, c] = arr;
console.log(a, b, c); // 10 20 30Пропуск елементів робиться порожнім місцем між комами:
const [first, , third] = [1, 2, 3];
console.log(first, third); // 1 3Значення за замовчуванням:
const [x = 0, y = 0, z = 0] = [5, 10];
console.log(x, y, z); // 5 10 0Rest-оператор збирає всі елементи, що лишилися, у новий масив:
const [first, ...rest] = [1, 2, 3, 4];
console.log(first); // 1
console.log(rest); // [2, 3, 4]Змішана деструктуризація
Об'єкти й масиви можна комбінувати в одному виразі:
const user = {
name: 'Tim',
hobbies: ['music', 'coding'],
address: { city: 'Berlin' }
};
const {
name,
hobbies: [firstHobby],
address: { city }
} = user;
console.log(name, firstHobby, city); // Tim music BerlinДеструктуризація у функціях
Розбір об'єкта прямо в аргументі позбавляє від довгого списку параметрів:
function greet({ name, age }) {
console.log(`Hello, ${name}! You are ${age}.`);
}
greet({ name: 'Alex', age: 25 }); // Hello, Alex! You are 25.Значення за замовчуванням у параметрах, разом із = {} для випадку, коли аргумент не передали взагалі:
function connect({ host = 'localhost', port = 3000 } = {}) {
console.log(`Connecting to ${host}:${port}`);
}
connect(); // Connecting to localhost:3000Так само зручно розбирати те, що функція повернула:
function getUser() {
return { name: 'Alex', age: 25 };
}
const { name, age } = getUser();
console.log(name, age); // Alex 25Навіщо потрібна деструктуризація
| Перевага | Пояснення |
|---|---|
| Короткий і чистий код | Менше повторів obj.prop |
| Зручна робота з аргументами функцій | Не треба передавати купу параметрів |
| Гнучкість | Можна задавати значення за замовчуванням, перейменовувати, пропускати |
| Часто використовується в React | Наприклад: const { user, loading } = useAuth(); |
Коротке резюме синтаксису:
| Тип | Синтаксис | Приклад |
|---|---|---|
| Об'єкт | { prop1, prop2 } = obj | const { name, age } = user; |
| Масив | [a, b] = arr | const [x, y] = [10, 20]; |
| Вкладені | { nested: { prop } } = obj | const { info: { id } } = data; |
| Rest | { a, ...rest } = obj або [a, ...rest] = arr | const { id, ...other } = user; |
| За замовчуванням | { prop = value } або [x = 0] | const { city = 'Paris' } = user; |
Типові помилки
- Плутати перейменування з типом.
const { name: userName } = userстворює зміннуuserName, а не оголошує тип; змінноїnameпісля цього не існує. - Чекати, що значення за замовчуванням спрацює для
null. Воно застосовується лише коли значенняundefined, тож{ city = 'Paris' }дляcity: nullдастьnull. - Деструктуризувати
undefinedабоnull.const { a } = undefinedкидаєTypeError; для параметрів рятує запис= {}. - Забувати, що масив розбирається за позицією. Імена змінних у
[a, b]нічого не означають, порядок вирішує все. - Починати рядок з
{при присвоєнні безconst. Вираз{ a } = obj;буде прочитано як блок; треба обгорнути в дужки:({ a } = obj);.
Коротка відповідь
Для співбесідиКоротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.