Как удалить свойство из объекта JavaScript? (delete, spread и другие способы)
Удаление свойства из объекта: полное руководство
В JavaScript есть несколько способов "удалить" свойство из объекта. Выбор зависит от того, нужно ли вам изменить исходный объект или создать новый. Рассмотрим все варианты.
1. Оператор delete (изменение исходного объекта)
Это самый прямой и правильный способ удалить свойство из объекта. Он полностью убирает и ключ, и значение из объекта.
const user = {
name: 'Алексей',
age: 30,
password: 'secret123'
};
delete user.password;
console.log(user); // { name: 'Алексей', age: 30 }
console.log('password' in user); // false
Важно:
deleteвозвращаетtrue, если удаление прошло успешно (даже если свойство не существовало).- Возвращает
false, если свойство нельзя удалить (например, у встроенных прототипов или если оно неконфигурируемое). - Работает только с собственными свойствами объекта (не удаляет из прототипа).
Миф о производительности: Да, в очень старых движках (IE8 и ниже) delete мог замедлять оптимизацию. В современных движках (V8, SpiderMonkey) это не проблема. Если вы удаляете 1-2 свойства — разницы нет. Если удаляете тысячи свойств в горячем цикле — возможно, стоит пересмотреть архитектуру.
2. Создание нового объекта без свойства (иммутабельный подход)
Используется, когда нужно сохранить исходный объект неизменным (например, в Redux или React).
Способ A: Деструктуризация + rest-оператор
const user = {
name: 'Алексей',
age: 30,
password: 'secret123',
role: 'admin'
};
const { password, ...userWithoutPassword } = user;
console.log(userWithoutPassword); // { name: 'Алексей', age: 30, role: 'admin' }
console.log(user.password); // 'secret123' — исходный объект не изменился
Способ B: Object.fromEntries + фильтрация
const user = { name: 'Алексей', age: 30, password: 'secret' };
const filtered = Object.fromEntries(
Object.entries(user).filter(([key]) => key !== 'password')
);
console.log(filtered); // { name: 'Алексей', age: 30 }
3. Удаление нескольких свойств
Если нужно удалить много свойств, удобно использовать массив ключей:
const user = {
name: 'Алексей',
age: 30,
password: 'secret123',
token: 'abc123',
role: 'admin'
};
const keysToRemove = ['password', 'token'];
keysToRemove.forEach(key => delete user[key]);
// или иммутабельно:
const cleanUser = Object.fromEntries(
Object.entries(user).filter(([key]) => !keysToRemove.includes(key))
);
4. Чего НЕ стоит делать
- Присваивать
undefined— свойство остаётся в объекте, и его можно перебрать черезfor...in. - Использовать
null— то же самое, свойство остаётся. - Пытаться удалить через
Object.assignс пустым значением — это не работает.
Итог: что выбрать?
- Если нужно изменить исходный объект —
delete. - Если нужно сохранить исходник (иммутабельность) — деструктуризация с rest.
- Если свойство может отсутствовать, а вы хотите избежать ошибок —
deleteвсё равно сработает (вернётtrue). - В редких случаях, когда свойство неконфигурируемое (например,
Math.PI),deleteвернётfalse.
Альтернативный подход: использование Reflect.deleteProperty
Начиная с ES6, у нас есть Reflect API, который предоставляет более современный способ удаления свойств. По сути, это та же операция delete, но в виде функции:
const user = { name: 'Алексей', age: 30, password: 'secret' };
const wasDeleted = Reflect.deleteProperty(user, 'password');
console.log(wasDeleted); // true
console.log(user); // { name: 'Алексей', age: 30 }
Преимущества Reflect.deleteProperty:
- Всегда возвращает
Boolean(а не сам объект, какdelete). - Лучше подходит для функционального программирования и композиции.
- Может быть переопределён через
Proxyдля кастомной логики удаления.
Однако на практике разницы почти нет — delete obj.prop и Reflect.deleteProperty(obj, 'prop') делают одно и то же. Выбирайте тот стиль, который вам удобнее. Лично я предпочитаю delete за его краткость.
Дополнительный совет: Если вы работаете с TypeScript, то при удалении свойства через delete может потребоваться утверждение типа (as any), так как TS считает, что все объявленные свойства обязательны. В этом случае иммутабельный подход с rest-оператором — лучший выбор, так как он корректно выводит типы.
Ответов пока нет.
Войдите чтобы оставить ответ