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
Спецификации
Совместимость с браузерами
| Десктопные | Мобильные | Серверные | |||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 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 |
См. также
© 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