Как удалить ключ (свойство) из объекта в JavaScript?
Основной способ: оператор delete
Самый простой и распространённый способ удалить свойство из объекта — использовать оператор delete. Он полностью удаляет ключ и его значение из объекта:
let user = {
name: 'Анна',
age: 25,
email: 'anna@example.com',
password: 'secret123'
};
delete user.password;
console.log(user);
// { name: 'Анна', age: 25, email: 'anna@example.com' }
console.log(user.password); // undefined
После выполнения delete свойство исчезает навсегда. Если попытаться обратиться к удалённому ключу, вернётся undefined. Важно: delete работает только с собственными свойствами объекта, не с унаследованными.
Важные нюансы
- Не используйте delete для массивов — он оставит «дырку» (пустой слот), длинна массива не изменится. Для массивов используйте
splice()илиfilter(). - delete не сработает, если свойство помечено как
configurable: false(например, у встроенных объектов). - Производительность: в современных движках
deleteможет замедлить оптимизацию, но для 99% случаев это не критично.
Альтернативный подход: создание нового объекта без ключа (иммутабельность)
Если вы не хотите изменять исходный объект, можно создать новый объект без определённого свойства. Это особенно полезно в React/Redux, где мутация данных недопустима. Самый элегантный способ — деструктуризация с rest-оператором:
let user = {
name: 'Анна',
age: 25,
email: 'anna@example.com',
password: 'secret123'
};
let { password, ...userWithoutPassword } = user;
console.log(userWithoutPassword);
// { name: 'Анна', age: 25, email: 'anna@example.com' }
console.log(user); // исходный объект не изменился
Здесь мы «вытаскиваем» свойство password в отдельную переменную, а все остальные свойства собираем в новый объект userWithoutPassword с помощью rest-оператора (...). Исходный объект остаётся нетронутым.
Удаление нескольких ключей
Если нужно удалить несколько свойств, можно объединить подходы:
let user = {
name: 'Анна',
age: 25,
email: 'anna@example.com',
password: 'secret123',
token: 'abc123'
};
// Вариант 1: последовательный delete
delete user.password;
delete user.token;
// Вариант 2: деструктуризация
let { password, token, ...cleanUser } = user;
Проверка на существование ключа
Перед удалением полезно проверить, существует ли свойство:
if ('password' in user) {
delete user.password;
}
// Или через hasOwnProperty
if (user.hasOwnProperty('password')) {
delete user.password;
}
В современных проектах чаще используют Object.hasOwn() (ES2022):
if (Object.hasOwn(user, 'password')) {
delete user.password;
}
Что насчёт унаследованных свойств?
delete удаляет только собственные свойства объекта. Унаследованные свойства (например, toString) удалить не получится — они находятся в прототипе. Если вы создали объект через класс или функцию-конструктор, удаление сработает только для свойств, заданных в самом объекте, а не в прототипе.
Итог
- Нужно мутировать объект → используйте
delete. - Нужно сохранить исходный объект неизменным → используйте деструктуризацию с rest-оператором.
- Для массового удаления или сложной логики рассмотрите
Object.fromEntries()с фильтрацией.
Дополнительный способ: через Object.assign или spread-оператор
Если вы работаете в старом коде или не хотите использовать деструктуризацию, можно создать новый объект с помощью Object.assign или spread-оператора, исключив ненужные ключи вручную:
let user = {
name: 'Анна',
age: 25,
email: 'anna@example.com',
password: 'secret123'
};
// Через Object.assign
let userClean1 = Object.assign({}, user);
delete userClean1.password;
// Через spread
let userClean2 = { ...user };
delete userClean2.password;
Этот подход менее элегантный, чем деструктуризация, но наглядный для новичков.
Динамическое удаление ключей
Если имя ключа хранится в переменной, используйте квадратные скобки:
let keyToRemove = 'password';
delete user[keyToRemove];
// Или с деструктуризацией
let { [keyToRemove]: _, ...rest } = user;
Производительность: что выбрать?
Для одноразового удаления в простом скрипте разницы нет. В высоконагруженных системах (игры, рендеринг) предпочитают иммутабельные подходы (деструктуризация), так как они позволяют движку V8 лучше оптимизировать код. delete может вывести объект из «быстрого режима» (dictionary mode), что замедлит доступ к его свойствам.
Заключение
Выбирайте подход под задачу:
- Простота и скорость написания →
delete. - Функциональный стиль / Redux → деструктуризация.
- Старый код →
Object.assign+ delete.
Ответов пока нет.
Войдите чтобы оставить ответ
Блоги
Микросервисы на Kotlin: архитектура и практика