Как удалить свойство из объекта JavaScript: быстрый способ
Узнайте, как безопасно удалить свойство из объекта JavaScript с помощью оператора delete, учитывая режим строгой проверки и конфигурируемость свойств.
Как удалить свойство из объекта JavaScript (ассоциативный массив)?
Например, если у меня есть:
var myArray = {};
myArray['firstname'] = 'Bob';
myArray['lastname'] = 'Smith';
myArray['age'] = 25;
Как удалить свойство lastname, чтобы оно больше не существовало в объекте? Мне нужно, чтобы объект оставался чистым и количество свойств было точным.
The delete operator removes a property from an object.
delete myArray['lastname']; // or delete myArray.lastname
На самом деле, после этого lastname больше не существует в myArray.
Содержание
- Какие свойства можно удалить?
- Как использовать оператор delete
- Альтернативы и иммутабельность
- Что происходит, если свойство не существует?
- Особенности строгого режима
- Ссылки на официальную документацию
Какие свойства можно удалить?
Другими словами, свойство можно удалить только если его атрибут configurable равен true.
На самом деле, свойства, созданные с помощью var, let или параметров функции, являются неконфигурируемыми, поэтому delete будет тихо неудачным (или выбросит ошибку в строгом режиме).
const obj = { a: 1 }; // configurable = true
delete obj.a; // ✅ succeeds
var b = 2; // non‑configurable
delete b; // ❌ silently fails (or throws in strict mode)
См. MDN для подробностей о дескрипторах свойств. MDN – Property Descriptors
Как использовать оператор delete
var myArray = {};
myArray['firstname'] = 'Bob';
myArray['lastname'] = 'Smith';
myArray['age'] = 25;
// Remove lastname
delete myArray['lastname']; // or delete myArray.lastname
console.log(myArray); // { firstname: 'Bob', age: 25 }
Другими словами, delete возвращает true, если свойство было успешно удалено или не существовало, иначе false.
Если вам нужен результат для обработки ошибок, проверьте его:
if (!delete myArray['lastname']) {
console.warn('Could not delete lastname');
}
Альтернативы и иммутабельность
Если хотите оставить исходный объект неизменным (например, при обновлении состояния в React), создайте новый объект без нежелательного свойства:
const { lastname, ...rest } = myArray; // rest содержит все остальные свойства
// rest is a new object: { firstname: 'Bob', age: 25 }
Reflect.deleteProperty(obj, prop) — функциональный эквивалент delete и может пригодиться при работе с прокси или высшими функциями. MDN – Reflect.deleteProperty
Что происходит, если свойство не существует?
delete возвращает true, даже если свойства не было:
delete myArray['middle']; // true
Так что вы можете вызывать его без предварительной проверки.
Особенности строгого режима
В строгом режиме ("use strict";):
- Удаление неконфигурируемого свойства вызывает
TypeError. - Удаление переменной, объявленной
var,letили параметра функции, вызываетSyntaxError.
"use strict";
var a = 1;
delete a; // throws TypeError
Для большинства объектов, созданных литералами или new Object(), это ограничение не действует. MDN – delete Operator
Ссылки на официальную документацию
- MDN – delete Operator
- MDN – Reflect.deleteProperty
- Stack Overflow – How do I remove a property from a JavaScript object?
- MDN – Property Descriptors
Заключение
- На самом деле, используйте
deleteдля удаления конфигурируемого свойства. - Он работает с литералами объектов,
Object.createи большинством динамических объектов. - В строгом режиме избегайте удаления неконфигурируемых свойств, чтобы не получить ошибки.
- Для иммутабельных обновлений предпочтительнее использовать деструктуризацию или
Object.assign, чтобы создать новый объект без нежелательного ключа. - Всегда проверяйте возвращаемое значение
delete, если нужно знать, удалось ли операция.