Деструктуризация объектов
Деструктуризация объектов — синтаксис ES6, позволяющий извлекать свойства объекта в переменные по именам ключей через паттерн
{ a, b } = obj.
Зачем нужно
Деструктуризация объектов делает код чище и компактнее: не нужно повторять obj.a, obj.b — достаточно один раз объявить нужные переменные. Особенно полезна в параметрах функций для документирования ожидаемых свойств и в импорте наборов утилит.
Где используется
- Извлечение нескольких свойств объекта в локальные переменные
- Параметры функций (вместо
options.timeout,options.retries) - Импорт именованных экспортов из модулей
- Переименование свойств при извлечении
Примеры
Базовая деструктуризация
const user = { name: 'Иван', age: 30, city: 'Москва' };
const { name, age } = user;
console.log(name); // 'Иван'
console.log(age); // 30
// city не деструктурирована — это нормально
Переименование
const { name: userName, age: userAge } = user;
console.log(userName); // 'Иван'
// name не определена в этой области
Значения по умолчанию
const { name, role = 'guest', active = true } = { name: 'Мария' };
console.log(role); // 'guest' (значение по умолчанию)
console.log(active); // true
Вложенная деструктуризация
const config = {
server: {
host: 'localhost',
port: 3000,
},
db: {
name: 'mydb',
},
};
const { server: { host, port }, db: { name: dbName } } = config;
console.log(host); // 'localhost'
console.log(port); // 3000
console.log(dbName); // 'mydb'
Rest в объекте
const { name: _, ...rest } = user;
console.log(rest); // { age: 30, city: 'Москва' }
// Удобно для исключения свойства при spread
const cleanUser = (({ password, ...safe }) => safe)(userWithPassword);
Параметры функции
// Без деструктуризации
function createUser(options) {
const name = options.name;
const role = options.role || 'user';
}
// С деструктуризацией (самодокументируется)
function createUser({ name, role = 'user', active = true }) {
return { name, role, active, id: Date.now() };
}
createUser({ name: 'Иван', role: 'admin' });
createUser({ name: 'Мария' }); // role = 'user', active = true
В циклах
const users = [
{ id: 1, name: 'Иван' },
{ id: 2, name: 'Мария' },
];
for (const { id, name } of users) {
console.log(`${id}: ${name}`);
}
Частые ошибки
- Деструктуризация
nullилиundefined—const { a } = nullвызоветTypeError; проверяйте значение до деструктуризации или используйте|| {}. - Переименование + умолчание одновременно — синтаксис:
const { a: renamed = 'default' } = obj;— сначала:для псевдонима, потом=для умолчания. - Путать с деструктуризацией массивов — объект:
{}, массив: ``.