Деструктуризация объектов
Деструктуризация объектов
Деструктуризация извлекает свойства объекта в именованные переменные — элегантнее, чем многократное обращение к полям.
Базовая деструктуризация
const user = { name: 'Иван', age: 25, role: 'admin' };
// Классический способ
const name = user.name;
const age = user.age;
// Деструктуризация
const { name, age } = user;
// name === 'Иван', age === 25
Переименование
const { name: userName, age: userAge } = user;
// userName === 'Иван', userAge === 25
// Переменных name и age не создаётся
Дефолтные значения
const { name = 'Аноним', role = 'user', active = true } = user;
// Дефолт применяется только если значение === undefined
// role = 'admin' (есть в объекте), active = true (дефолт — нет в объекте)
// Совмещение переименования и дефолта
const { name: displayName = 'Гость' } = user;
Вложенная деструктуризация
const config = {
server: {
host: 'localhost',
port: 3000,
ssl: false
},
database: {
host: 'db.local',
name: 'mydb'
}
};
// Вложенная деструктуризация
const { server: { host, port }, database: { name: dbName } } = config;
// host = 'localhost', port = 3000, dbName = 'mydb'
// server и database — не создаются как переменные
При вложенной деструктуризации
server — это не переменная, а паттерн. console.log(server) даст ReferenceError.Rest в деструктуризации
const user = { id: 1, name: 'Иван', age: 25, role: 'admin', email: 'i@i.com' };
const { id, name, ...rest } = user;
// id = 1, name = 'Иван'
// rest = { age: 25, role: 'admin', email: 'i@i.com' }
Деструктуризация в параметрах функции
// Без деструктуризации
function greet(user) {
return `Привет, ${user.name}! Роль: ${user.role}`;
}
// С деструктуризацией — ясно что нужно функции
function greet({ name, role = 'пользователь' }) {
return `Привет, ${name}! Роль: ${role}`;
}
greet({ name: 'Иван', role: 'admin' });
greet({ name: 'Мария' }); // role = 'пользователь' по умолчанию
Хотя деструктуризация объектов не используется для swap (в отличие от массивов), с массивами это элегантно:
let a = 1, b = 2;
[a, b] = [b, a]; // swap без временной переменной
// a = 2, b = 1