Удаляет объект, свойство объекта или элемент массива по указанному индексу.
Значением 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()
хотя по стандарту операция валидна
Вот отстой,строку никак удалить нельзя
Roksa pyzdry
Luksuria roksa
Educational games can be GeoGuessr Free a fun way to learn new skills and knowledge.
Отправить комментарий
Приветствуются комментарии:Для остальных вопросов и обсуждений есть форум.