Что такое деструктуризация в JavaScript?
Деструктуризация в JavaScript
Деструктуризация (destructuring assignment) — это синтаксический сахар ES6, который позволяет «распаковывать» значения из массивов или свойства из объектов в отдельные переменные. Код становится короче и читаемее.
Деструктуризация объектов
При деструктуризации объекта имена переменных должны совпадать с именами свойств:
const user = { name: 'Иван', age: 25, city: 'Москва' };
// Без деструктуризации
const name = user.name;
const age = user.age;
// С деструктуризацией
const { name, age } = user;
console.log(name); // 'Иван'
Переименование и значения по умолчанию
const { name: userName, role = 'user' } = user;
// userName = 'Иван', role = 'user' (так как свойства нет в объекте)
Вложенная деструктуризация
const { address: { street } } = { address: { street: 'Арбат' } };
console.log(street); // 'Арбат'
Деструктуризация массивов
Для массивов используются квадратные скобки, порядок имеет значение:
const colors = ['red', 'green', 'blue'];
const [first, second] = colors;
console.log(first); // 'red'
console.log(second); // 'green'
Пропуск элементов
const [, , third] = colors;
console.log(third); // 'blue'
Rest-оператор
const [head, ...tail] = [1, 2, 3, 4];
console.log(head); // 1
console.log(tail); // [2, 3, 4]
Практические применения
Обмен переменных
let a = 1, b = 2;
[a, b] = [b, a];
console.log(a, b); // 2 1
Деструктуризация параметров функции
function greet({ name, age = 18 }) {
return `Привет, ${name}! Тебе ${age} лет.`;
}
greet({ name: 'Анна', age: 22 }); // 'Привет, Анна! Тебе 22 лет.'
Деструктуризация возвращаемого значения
function getCoords() {
return { x: 10, y: 20 };
}
const { x, y } = getCoords();
Важные нюансы
- При деструктуризации
nullилиundefinedвыбрасываетсяTypeError— нужно защищаться дефолтным значением или проверкой. - Значения по умолчанию срабатывают только если свойство равно
undefined, но неnull. - Порядок важен для массивов, но не для объектов.
Что хочет услышать интервьюер
Кандидат объяснит разницу между деструктуризацией объектов (по имени свойства) и массивов (по позиции)
Упомянет значения по умолчанию и переименование при деструктуризации объектов
Знает про rest-оператор (...rest) в деструктуризации
Понимает деструктуризацию параметров функции как практический паттерн
Осознаёт, что деструктуризация null/undefined вызывает ошибку
Пример: Деструктуризация объекта с переименованием и дефолтами
interface User {
name: string;
age?: number;
role?: string;
}
const user: User = { name: 'Иван' };
// Переименование name -> userName, дефолты для отсутствующих полей
const { name: userName, age = 18, role = 'user' } = user;
console.log(userName); // 'Иван'
console.log(age); // 18 (дефолт, так как undefined)
console.log(role); // 'user' (дефолт)
Пример: Деструктуризация массива и обмен переменных
const scores = [95, 80, 70, 60, 50];
// Берём первый элемент, пропускаем второй, собираем остальные
const [best, , ...rest] = scores;
console.log(best); // 95
console.log(rest); // [70, 60, 50]
// Классический обмен без временной переменной
let a = 1, b = 2;
[a, b] = [b, a];
console.log(a, b); // 2 1
Пример: Деструктуризация параметров функции
interface Config {
host: string;
port?: number;
ssl?: boolean;
}
// Деструктурируем прямо в параметрах — удобно для конфигов
function connect({ host, port = 3000, ssl = false }: Config): string {
const protocol = ssl ? 'https' : 'http';
return `${protocol}://${host}:${port}`;
}
console.log(connect({ host: 'example.com' }));
// 'http://example.com:3000'
Типичные ошибки
Путают синтаксис объектной и массивной деструктуризации (используют [] для объектов)
Не знают, что значение по умолчанию не срабатывает при null — только при undefined
Забывают про переименование переменных через двоеточие: { prop: newName }
Путают rest-оператор в деструктуризации с spread-оператором при вызове функций
Не обрабатывают случай, когда деструктурируемое значение может быть undefined/null


