Я немного запутался с delete
оператором JavaScript . Возьмите следующий кусок кода:
var obj = {
helloText: "Hello World!"
};
var foo = obj;
delete obj;
После того, как этот кусок кода был выполнен, obj
есть null
, но foo
все еще ссылается на объект в точности как obj
. Я предполагаю, что этот объект - тот же самый объект, который foo
указал.
Это смущает меня, потому что я ожидал, что запись delete obj
удалила объект, на который obj
указывал в памяти, а не только переменную obj
.
Это из-за того, что сборщик мусора в JavaScript работает на основе сохранения / выпуска, чтобы, если бы у меня не было других переменных, указывающих на объект, он был бы удален из памяти?
(Кстати, мое тестирование проводилось в Safari 4.)
javascript
pointers
object
memory-management
garbage-collection
Стив Харрисон
источник
источник
var obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
объект не удален. Проверьтеobj
использование удаления:delete obj.helloText
и затем проверьтеfoo now foo is an empty object
delete
не для удаления объектов в javascript.delete
Используется для удаления ключа объекта. В вашем случаеvar obj = { helloText: "Hello World!" }; var foo = obj; delete obj;
объект не удаляется. Проверьтеobj
. Далее запустите,delete obj.helloText
и вы увидите, чтоfoo
теперь указывает на пустой объект. "" "Ответы:
Оператор удаления удаляет только ссылку, но не сам объект. Если бы он действительно удалил сам объект, другие оставшиеся ссылки были бы висячими, как удаление C ++. (И доступ к одному из них приведет к сбою. Чтобы все они стали пустыми, это означало бы дополнительную работу при удалении или дополнительную память для каждого объекта.)
Поскольку Javascript является сборщиком мусора, вам не нужно самим удалять объекты - они будут удалены, когда на них больше не будет возможности ссылаться.
Может быть полезно удалить ссылки на объект, если вы закончили с ними, потому что это дает сборщику мусора больше информации о том, что можно восстановить. Если ссылки остаются на большой объект, это может привести к тому, что он не будет восстановлен, даже если остальная часть вашей программы фактически не использует этот объект.
источник
delete
Ключевое слово работает только для свойств объекта, а не переменных. perfectionkills.com/understanding-deletevar obj = {a: {}}; delete obj.a;
window
?var
)Команда
delete
не влияет на обычные переменные, только на свойства. Послеdelete
команды свойство не имеет значенияnull
, оно вообще не существует.Если свойство является ссылкой на объект,
delete
команда удаляет свойство, но не объект. Сборщик мусора позаботится об объекте, если у него нет других ссылок на него.Пример:
(Проверено в Firefox.)
источник
x
переменная становится просто свойством глобальногоwindow
объекта иdelete x;
действительно удаляетx
переменную вообще.x
в некоторых браузерах будет не правильная переменная, а свойствоwindow
объекта. Это, конечно, проблема с консолью, и она не отражает, как обычно выполняется код.«переменные, объявленные неявно» - это свойства глобального объекта, поэтому delete работает с ними так же, как и с любым свойством. Переменные, объявленные с помощью var, неразрушимы.
источник
let
.Исходя из документации Mozilla: «Вы можете использовать оператор delete для удаления переменных, объявленных неявно, но не тех, которые объявлены с помощью оператора var».
Вот ссылка: https://developer.mozilla.org/En/Core_JavaScript_1.5_Reference:Operators:Special_Operators:delete_Operator
источник
delete
не используется для удаления объекта в Java Script.delete
используется для удаленияobject key
в вашем случаеобъект не удален проверить объект все еще принимать те же значения удалить использование:
и затем проверьте
obj, foo
, оба являются пустым объектом.источник
Только что нашел jsperf, который может показаться вам интересным в свете этого вопроса. (это может быть удобно, чтобы держать его рядом, чтобы завершить картину)
Сравнивает удаление , установка нуля и установка неопределенных .
Но имейте в виду, что он тестирует случай, когда вы удаляете / устанавливаете свойство много раз.
источник
Помимо вопросов GC, для повышения производительности следует учитывать оптимизацию, которую браузер может выполнять в фоновом режиме ->
http://coding.smashingmagazine.com/2012/11/05/writing-fast-memory-efficient-javascript/
Похоже, что может быть лучше обнулить ссылку, чем удалить ее, так как это может изменить скрытый класс, используемый Chrome.
источник
В IE 5–8 есть ошибка, когда при использовании delete для свойств хост-объекта (Window, Global, DOM и т. Д.) Выдается TypeError «объект не поддерживает это действие».
Позже, если вам нужно проверить, где свойство имеет полное значение, используйте значение,
el.foo !== undefined
потому"foo" in el
что всегда будет возвращать true в IE.Если вам действительно нужна собственность, чтобы действительно исчезнуть ...
если вам нужно использовать объект host с host api ...
источник
Я наткнулся на эту статью в поисках этого же ответа. В конечном итоге я просто извлек
obj.pop()
все сохраненные значения / объекты в моем объекте, чтобы я мог повторно использовать этот объект. Не уверен, если это плохая практика или нет. Этот метод пригодился мне для тестирования моего кода с помощью инструментов Chrome Dev или FireFox Web Console.источник
Это работа для меня, хотя это не очень хорошая практика. Он просто удаляет все связанные элементы, к которым принадлежит объект.
источник
Установка переменной, которая
null
гарантирует, что все ссылки на объекты во всех браузерах будут прерываться, включая циклические ссылки между элементами DOM и областями Javascript. Используяdelete
команду, мы помечаем объекты, которые необходимо очистить при следующем запуске сборки мусора, но если существует несколько переменных, ссылающихся на один и тот же объект, удаление одной переменной НЕ БУДЕТ освободить объект, оно просто удалит связь между этой переменной и предмет. И при следующем запуске сборки мусора будет очищена только переменная.источник