Удаляет объект, свойство объекта или элемент массива по указанному индексу.
Значением expression
должна являтся ссылка на удаляемое свойство, например:
delete variableName
delete objectExpression.property
delete objectExpression["property"]
delete array[index]
Если expression
не приводится к свойству, оператор delete
не делает ничего.
При успешном выполнении оператор delete
удаляет свойство из объекта.
При этом delete
не меняет прототип объекта, даже если там есть свойство, совпадающее по названию с удаляемым.
Некоторые свойства объектов не могут быть удалены. В спецификации такие свойства обозначены флагом DontDelete
.
Можно удалить переменные, объявленные глобально без var
, но нельзя - объявленные через var
.
Оператор delete
возвращает false
только если свойство существует, но не может быть удалено, и true
- в любых других случаях.
x = 42; // создать свойство глобального объекта window
var y = 43; // объявить как переменную
myobj = new Number()
myobj.h = 4 // создать свойство h
myobj.k = 5 // создать свойство k
delete x // возвратит true (объявлено без var)
delete y // возвратит false (объявлено с var, флаг DontDelete)
delete Math.PI // возвратит false (встроенный объект, флаг DontDelete)
delete myobj.h // возвратит true (пользовательское свойство)
with(myobj) {
delete k; // возвратит true (эквивалент delete myobj.k)
}
delete myobj // возвратит true (аналог delete x)
Вы не можете удалить свойство из объекта, которое он унаследовал от прототипа (хотя вы можете удалить его напрямую из прототипа).
function Foo(){}
Foo.prototype.bar = 42;
var foo = new Foo();
delete foo.bar; // ничего не сделает
alert(foo.bar); // введет 42, свойство унаследовано
delete Foo.prototype.bar; // удалит из прототипа
alert(foo.bar); // выведет "undefined", свойства больше нет
При удалении элементов массива, его длина не меняется. Даже если вы удалите последний элемент: delete a[a.length-1]
- его длина останется той же.
При этом элемент исчезнет из массива:
arr = ["a", "b", "c"]
delete arr[1] // удалили b
alert(arr.length) // 3
alert(arr[1]) // undefined
alert(1 in arr) // **false**
Если вы хотите, чтобы элемент остался в массиве, но стал undefined
- просто приравняйте его к undefined
:
arr[1] = undefined
alert(1 in arr) // **true**
А можно ли как-то удалить класс, например
function Foo(){}
delete Foo;
Почему-то использование window.Foo = null; не очищает память...
в javascripte нет классов! Это не класс а объект, а конкретнее - функция-конструктор. Память очищает сборщик мусора, который решает удалять ли данные по каким-то своим магическим алгоритмам.
Как написано в коменте выше, это не класс, а функция. Функцию можно удалить так же, как и любой другой объект, если создавать ее динамически и присваивать в глобальную переменную. Вот так, например, можно:
Foo = function(){};
delete Foo;
Написаный вами вариант эквивалентен следующему:
var Foo = function(){};
delete Foo;
А как написано в статье, переменные, объявленные через var, удалять нельзя.
Оператор delete удаляет не сам объект, а ссылку(указатель) на объект.
Пример
Тоесть из объекта а мы удалили ссылку на объект [1,2,3], но сам объект из памяти не удалился, т.к. на него указывает другой указатель. Объект удалится только по прихоти и решению GC.
к сожалению даже узнать, удалил ли мусоросборщик этот объект, не получиться:
В браузерах Chrome Версия 19.0.1084.56 и Firefox 13.0 удаляется:
локальные элементы в текущем closure удалять нельзя, видимо, GC итак их удалит при выходе из closure
А вот Google Closure при проверке кода на валидность ругается на удаление результата функции, т.е.
delete foo()
хотя по стандарту операция валидна
Вот отстой,строку никак удалить нельзя