Программирование

Как удалить свойство из объекта JavaScript: быстрый способ

Узнайте, как безопасно удалить свойство из объекта JavaScript с помощью оператора delete, учитывая режим строгой проверки и конфигурируемость свойств.

Как удалить свойство из объекта JavaScript (ассоциативный массив)?
Например, если у меня есть:

js
var myArray = {};
myArray['firstname'] = 'Bob';
myArray['lastname'] = 'Smith';
myArray['age'] = 25;

Как удалить свойство lastname, чтобы оно больше не существовало в объекте? Мне нужно, чтобы объект оставался чистым и количество свойств было точным.

The delete operator removes a property from an object.

js
delete myArray['lastname'];   // or delete myArray.lastname

На самом деле, после этого lastname больше не существует в myArray.

Содержание


Какие свойства можно удалить?

Другими словами, свойство можно удалить только если его атрибут configurable равен true.
На самом деле, свойства, созданные с помощью var, let или параметров функции, являются неконфигурируемыми, поэтому delete будет тихо неудачным (или выбросит ошибку в строгом режиме).

js
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

js
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.
Если вам нужен результат для обработки ошибок, проверьте его:

js
if (!delete myArray['lastname']) {
  console.warn('Could not delete lastname');
}

Альтернативы и иммутабельность

Если хотите оставить исходный объект неизменным (например, при обновлении состояния в React), создайте новый объект без нежелательного свойства:

js
const { lastname, ...rest } = myArray; // rest содержит все остальные свойства
// rest is a new object: { firstname: 'Bob', age: 25 }

Reflect.deleteProperty(obj, prop) — функциональный эквивалент delete и может пригодиться при работе с прокси или высшими функциями. MDN – Reflect.deleteProperty


Что происходит, если свойство не существует?

delete возвращает true, даже если свойства не было:

js
delete myArray['middle']; // true

Так что вы можете вызывать его без предварительной проверки.


Особенности строгого режима

В строгом режиме ("use strict";):

  • Удаление неконфигурируемого свойства вызывает TypeError.
  • Удаление переменной, объявленной var, let или параметра функции, вызывает SyntaxError.
js
"use strict";
var a = 1;
delete a; // throws TypeError

Для большинства объектов, созданных литералами или new Object(), это ограничение не действует. MDN – delete Operator


Ссылки на официальную документацию

  1. MDN – delete Operator
  2. MDN – Reflect.deleteProperty
  3. Stack Overflow – How do I remove a property from a JavaScript object?
  4. MDN – Property Descriptors

Заключение

  • На самом деле, используйте delete для удаления конфигурируемого свойства.
  • Он работает с литералами объектов, Object.create и большинством динамических объектов.
  • В строгом режиме избегайте удаления неконфигурируемых свойств, чтобы не получить ошибки.
  • Для иммутабельных обновлений предпочтительнее использовать деструктуризацию или Object.assign, чтобы создать новый объект без нежелательного ключа.
  • Всегда проверяйте возвращаемое значение delete, если нужно знать, удалось ли операция.
Авторы
Проверено модерацией
Модерация