Как удалить свойство из объекта JavaScript?
Основной способ: оператор delete
Самый прямой и часто используемый способ удалить свойство из объекта — это оператор delete. Он удаляет свойство из объекта полностью, а не просто устанавливает его значение в undefined.
const user = {
name: 'Иван',
email: 'ivan@example.com',
password: 'secret123',
role: 'admin'
};
delete user.password;
console.log(user);
// { name: 'Иван', email: 'ivan@example.com', role: 'admin' }
// Свойство password больше не существует в объекте
Важно понимать: delete изменяет исходный объект (мутирует его). Если вам нужно сохранить исходный объект, используйте другие подходы (см. ниже).
Мифы о производительности delete
В современных движках JavaScript (V8, SpiderMonkey) delete не так уж медленнен, как иногда говорят. Однако есть нюансы:
deleteможет замедлить доступ к другим свойствам объекта, если объект оптимизирован под "быстрый доступ" (например, если он создан как литерал). Движок может переключить объект в "медленный" режим (dictionary mode).- Для подавляющего большинства приложений (особенно начинающих разработчиков) эта разница незаметна. Не заморачивайтесь с оптимизацией, пока не столкнетесь с реальной проблемой производительности.
deleteне работает со свойствами, у которых флагconfigurable: false(например, для глобальных переменных, созданных черезvar).
Альтернативы delete для создания нового объекта
Если вы не хотите изменять исходный объект, используйте деструктуризацию или Object.fromEntries.
Способ 1: Деструктуризация с rest-оператором (рекомендуется)
const user = {
name: 'Иван',
email: 'ivan@example.com',
password: 'secret123',
role: 'admin'
};
// Удаляем password, остальные свойства собираем в newUser
const { password, ...newUser } = user;
console.log(newUser);
// { name: 'Иван', email: 'ivan@example.com', role: 'admin' }
console.log(user.password); // 'secret123' — исходный объект не изменен
Этот способ элегантен, читаем и не мутирует исходный объект. Можно удалить несколько свойств:
const { password, role, ...publicUser } = user;
// publicUser: { name: 'Иван', email: 'ivan@example.com' }
Способ 2: Object.fromEntries с фильтрацией
const newUser = Object.fromEntries(
Object.entries(user).filter(([key]) => key !== 'password')
);
// { name: 'Иван', email: 'ivan@example.com', role: 'admin' }
Подходит, если нужно удалить свойства динамически (например, по массиву ключей).
Когда использовать delete, а когда альтернативы?
- delete — когда нужно изменить исходный объект и вы уверены, что это не повлияет на производительность (например, в обработчиках событий или простых скриптах).
- Деструктуризация — когда нужно создать новый объект без изменения исходного (например, для иммутабельного обновления состояния в React).
- Object.fromEntries — когда ключи для удаления неизвестны заранее (например, список ключей приходит из конфигурации).
Важные замечания
deleteвозвращаетtrue, если свойство было успешно удалено (даже если его не существовало), иfalseтолько если свойство неконфигурируемо.- Не используйте
deleteдля удаления свойств из массива (это оставит "дырку"). Для массивов используйтеspliceилиfilter. - Если свойство унаследовано через прототип,
deleteудалит его только у конкретного экземпляра, но не у прототипа.
Удаление через установку значения в undefined (не рекомендуется)
Некоторые новички пытаются "удалить" свойство, присваивая ему undefined:
const obj = { a: 1, b: 2 };
obj.a = undefined;
console.log(obj); // { a: undefined, b: 2 }
console.log('a' in obj); // true — свойство всё ещё существует!
Это не удаляет свойство — оно остается в объекте, просто его значение становится undefined. При итерации (for...in, Object.keys) оно будет учитываться. Используйте этот подход только если вам нужно явно показать, что свойство существует, но не имеет значения (например, для сериализации в JSON — такие свойства будут включены).
Удаление через Reflect.deleteProperty
Современный аналог delete — статический метод Reflect.deleteProperty:
const obj = { a: 1, b: 2 };
Reflect.deleteProperty(obj, 'a');
console.log(obj); // { b: 2 }
Он делает то же самое, что и delete, но возвращает true/false строго по спецификации и может быть удобен для функционального программирования (например, в цепочках вызовов).
Практический совет для начинающих
Не бойтесь оператора delete. Он существует в языке с самого начала и отлично справляется со своей задачей. Если вы пишете простой скрипт или не заботитесь об иммутабельности — используйте delete. Если работаете с состоянием (React, Redux) — используйте деструктуризацию.
Ответов пока нет.
Войдите чтобы оставить ответ