Spec-Zone.ru › JavaScript

delete

Базовый уровень Широко доступно

Эта функция хорошо зарекомендовала себя и работает на многих устройствах и версиях браузеров. Она доступна во всех браузерах с июля 2015 года.

Оператор delete удаляет свойство из объекта. Если значение свойства является объектом и на этот объект больше нет ссылок, объект, связанный с этим свойством, в конечном итоге автоматически освобождается.

Попробуйте

const employee = {
  firstName: "Maria",
  lastName: "Sanchez",
};

console.log(employee.firstName);
// Expected output: "Maria"

delete employee.firstName;

console.log(employee.firstName);
// Expected output: undefined

Синтаксис

delete object.property
delete object[property]

Примечание: Синтаксис допускает более широкий диапазон выражений после оператора delete, но только описанные выше формы приводят к осмысленному поведению.

Параметры

object
Имя объекта или выражение, результатом которого является объект.
property
Удаляемое свойство.

Возвращаемое значение

true во всех случаях, за исключением тех, когда свойство является собственным ненастраиваемым свойством; в этом случае в нестрогом режиме возвращается false.

Исключения

TypeError
Выбрасывается в строгом режиме, если свойство является собственным ненастраиваемым свойством.
ReferenceError
Выбрасывается, если object является super.

Описание

Оператор delete имеет тот же приоритет, что и другие унарные операторы, такие как typeof. Следовательно, он принимает любое выражение, образованное операторами с более высоким приоритетом. Однако следующие формы приводят к ранним синтаксическим ошибкам в строгом режиме:

delete identifier;
delete object.#privateProperty;

Поскольку классы автоматически находятся в строгом режиме, а закрытые элементы могут быть законно использованы только в теле класса, это означает, что закрытые элементы никогда не могут быть удалены. Хотя delete identifier может сработать, если identifier ссылается на настраиваемое свойство глобального объекта, вам следует избегать этой формы и вместо этого использовать префикс globalThis.

Хотя другие выражения принимаются, они не приводят к осмысленному поведению:

delete console.log(1);
// Logs 1, returns true, but nothing deleted

Оператор delete удаляет заданное свойство из объекта. В случае успешного удаления он вернет true, в противном случае будет возвращено false. В отличие от распространенного мнения (возможно, из-за других языков программирования, таких как delete в C++), оператор delete не имеет ничего общего с прямым освобождением памяти. Управление памятью осуществляется косвенно путем разрыва ссылок. Подробнее см. на странице управления памятью.

Важно учитывать следующие сценарии:

  • Если свойство, которое вы пытаетесь удалить, не существует, delete не будет иметь никакого эффекта и вернет true.
  • delete влияет только на собственные свойства. Если в цепочке прототипов объекта существует свойство с тем же именем, то после удаления объект будет использовать свойство из цепочки прототипов.
  • Ненастраиваемые свойства не могут быть удалены. Сюда входят свойства встроенных объектов, таких как Math, Array, Object, а также свойства, созданные как ненастраиваемые с помощью таких методов, как Object.defineProperty().
  • Удаление переменных, включая параметры функций, никогда не работает. delete variable выбросит SyntaxError в строгом режиме и не будет иметь никакого эффекта в нестрогом режиме.
    • Любая переменная, объявленная с помощью var, не может быть удалена из глобальной области видимости или области видимости функции, поскольку, хотя они могут быть присоединены к глобальному объекту, они не являются настраиваемыми.
    • Любая переменная, объявленная с помощью let или const, не может быть удалена из области видимости, в которой она была определена, поскольку они не привязаны к объекту.

Примеры

Использование delete

Примечание: Следующий пример использует функции, доступные только в нестрогом режиме, такие как неявное создание глобальных переменных и удаление идентификаторов, что запрещено в строгом режиме.

// Creates the property empCount on the global scope.
// Since we are using var, this is marked as non-configurable.
var empCount = 43;

// Creates the property EmployeeDetails on the global scope.
// Since it was defined without "var", it is marked configurable.
EmployeeDetails = {
  name: "xyz",
  age: 5,
  designation: "Developer",
};

// delete can be used to remove properties from objects.
delete EmployeeDetails.name; // returns true

// Even when the property does not exist, delete returns "true".
delete EmployeeDetails.salary; // returns true

// EmployeeDetails is a property of the global scope.
delete EmployeeDetails; // returns true

// On the contrary, empCount is not configurable
// since var was used.
delete empCount; // returns false

// delete also does not affect built-in static properties
// that are non-configurable.
delete Math.PI; // returns false

function f() {
  var z = 44;

  // delete doesn't affect local variable names
  delete z; // returns false
}

delete и цепочка прототипов

В следующем примере мы удаляем собственное свойство объекта, в то время как свойство с тем же именем доступно в цепочке прототипов:

function Foo() {
  this.bar = 10;
}

Foo.prototype.bar = 42;

const foo = new Foo();

// foo.bar is associated with the
// own property.
console.log(foo.bar); // 10

// Delete the own property within the
// foo object.
delete foo.bar; // returns true

// foo.bar is still available in the
// prototype chain.
console.log(foo.bar); // 42

// Delete the property on the prototype.
delete Foo.prototype.bar; // returns true

// The "bar" property can no longer be
// inherited from Foo since it has been
// deleted.
console.log(foo.bar); // undefined

Удаление элементов массива

При удалении элемента массива length массива не изменяется. Это справедливо, даже если вы удаляете последний элемент массива.

Когда оператор delete удаляет элемент массива, этот элемент больше не находится в массиве. В следующем примере trees[3] удаляется с помощью delete.

const trees = ["redwood", "bay", "cedar", "oak", "maple"];
delete trees[3];
console.log(3 in trees); // false

Это создает разреженный массив с пустым слотом. Если вы хотите, чтобы элемент массива существовал, но имел неопределенное значение, используйте значение undefined вместо оператора delete. В следующем примере trees[3] присваивается значение undefined, но элемент массива по-прежнему существует:

const trees = ["redwood", "bay", "cedar", "oak", "maple"];
trees[3] = undefined;
console.log(3 in trees); // true

Если же вы хотите удалить элемент массива, изменив содержимое массива, используйте метод splice(). В следующем примере trees[3] полностью удаляется из массива с помощью splice():

const trees = ["redwood", "bay", "cedar", "oak", "maple"];
trees.splice(3, 1);
console.log(trees); // ["redwood", "bay", "cedar", "maple"]

Удаление ненастраиваемых свойств

Когда свойство помечено как ненастраиваемое, delete не будет иметь никакого эффекта и вернет false. В строгом режиме это вызовет TypeError.

const Employee = {};
Object.defineProperty(Employee, "name", { configurable: false });

console.log(delete Employee.name); // returns false

var создает ненастраиваемые свойства, которые не могут быть удалены оператором delete:

// Since "nameOther" is added using with the
// var keyword, it is marked as non-configurable
var nameOther = "XYZ";

// We can access this global property using:
Object.getOwnPropertyDescriptor(globalThis, "nameOther");
// {
//   value: "XYZ",
//   writable: true,
//   enumerable: true,
//   configurable: false
// }

delete globalThis.nameOther; // return false

В строгом режиме это вызовет исключение.

Удаление глобальных свойств

Если глобальное свойство является настраиваемым (например, через прямое присваивание свойств), оно может быть удалено, и последующие ссылки на него как на глобальную переменную вызовут ReferenceError.

globalThis.globalVar = 1;
console.log(globalVar); // 1
// In non-strict mode, you can use `delete globalVar` as well
delete globalThis.globalVar;
console.log(globalVar); // ReferenceError: globalVar is not defined

Спецификации

Спецификация
ECMAScript® 2027 Language Specification
# sec-delete-operator

Совместимость с браузерами

Десктопные Мобильные Серверные
Chrome Edge Firefox Opera Safari Chrome Android Firefox for Android Opera Android Safari on iOS Samsung Internet WebView Android WebView on iOS Bun Deno Node.js
delete
1
12
1
9
1
18
4
10.1
1
1.0
4.4
1
1.0.0
1.0
0.10.0

См. также

  • Reflect.deleteProperty()
  • Map.prototype.delete()

© 2005–2025 MDN contributors.
Licensed under the Creative Commons Attribution-ShareAlike License v2.5 or later.
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/delete

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API