Javascript.RU

delete

Синтаксис

delete expression

Аргументы

expression
выражение, приводимое к ссылке на удаляемый объект

Описание, примеры

Удаляет объект, свойство объекта или элемент массива по указанному индексу.

Значением 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**

См. также


Автор: dr.Dos (не зарегистрирован), дата: 6 мая, 2011 - 18:03
#permalink

А можно ли как-то удалить класс, например
function Foo(){}
delete Foo;

Почему-то использование window.Foo = null; не очищает память...


Автор: Гость (не зарегистрирован), дата: 25 мая, 2011 - 12:14
#permalink

в javascripte нет классов! Это не класс а объект, а конкретнее - функция-конструктор. Память очищает сборщик мусора, который решает удалять ли данные по каким-то своим магическим алгоритмам.


Автор: Гость (не зарегистрирован), дата: 8 июля, 2011 - 17:27
#permalink

Как написано в коменте выше, это не класс, а функция. Функцию можно удалить так же, как и любой другой объект, если создавать ее динамически и присваивать в глобальную переменную. Вот так, например, можно:
Foo = function(){};
delete Foo;

Написаный вами вариант эквивалентен следующему:

var Foo = function(){};
delete Foo;

А как написано в статье, переменные, объявленные через var, удалять нельзя.


Автор: kozorezal, дата: 18 января, 2012 - 01:38
#permalink

Оператор delete удаляет не сам объект, а ссылку(указатель) на объект.
Пример

var a = {b:[1,2,3]};
var c = a.b;
delete a.b;
console.log(c) //[1,2,3]

Тоесть из объекта а мы удалили ссылку на объект [1,2,3], но сам объект из памяти не удалился, т.к. на него указывает другой указатель. Объект удалится только по прихоти и решению GC.


Автор: FeelUs, дата: 24 января, 2016 - 17:25
#permalink

к сожалению даже узнать, удалил ли мусоросборщик этот объект, не получиться:

var obj={};
obj.p = {};
var ref = obj.p;
alert(delete obj.p)//true

Автор: ЖРЕЦъ (не зарегистрирован), дата: 20 июня, 2012 - 19:45
#permalink
x = 42;        // создать свойство глобального объекта window
var y = 43;    // объявить как переменную

delete x       // возвратит true (объявлено без var)
delete y       // возвратит false (объявлено с var, флаг DontDelete)

В браузерах Chrome Версия 19.0.1084.56 и Firefox 13.0 удаляется:

x = 42;        // создать свойство глобального объекта window
var y = 43;    // объявить как переменную

delete x       // возвратит true (объявлено без var)
delete y       // возвратит true (объявлено с var)

Автор: blackswanny, дата: 7 сентября, 2012 - 16:41
#permalink

локальные элементы в текущем closure удалять нельзя, видимо, GC итак их удалит при выходе из closure
А вот Google Closure при проверке кода на валидность ругается на удаление результата функции, т.е.
delete foo()
хотя по стандарту операция валидна


Отправить комментарий

Приветствуются комментарии:
  • Полезные.
  • Дополняющие прочитанное.
  • Вопросы по прочитанному. Именно по прочитанному, чтобы ответ на него помог другим разобраться в предмете статьи. Другие вопросы могут быть удалены.
    Для остальных вопросов и обсуждений есть форум.
P.S. Лучшее "спасибо" - не комментарий, как все здорово, а рекомендация или ссылка на статью.
Содержание этого поля является приватным и не предназначено к показу.
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Разрешены HTML-таги: <strike> <a> <em> <strong> <cite> <code> <ul> <ol> <li> <dl> <dt> <dd> <u> <i> <b> <pre> <img> <abbr> <blockquote> <h1> <h2> <h3> <h4> <h5> <p> <div> <span> <sub> <sup>
  • Строки и параграфы переносятся автоматически.
  • Текстовые смайлы будут заменены на графические.

Подробнее о форматировании

CAPTCHA
Антиспам
3 + 4 =
Введите результат. Например, для 1+3, введите 4.
 
Поиск по сайту
Реклама
Содержание

Учебник javascript

Основные элементы языка

Сундучок с инструментами

Интерфейсы

Все об AJAX

Оптимизация

Разное

Дерево всех статей

Последние комментарии
Последние темы на форуме
Forum