Javascript 垃圾收集:对象属性
假设我有一个对象,其中包含另一个对象作为其属性,如Javascript 垃圾收集:对象属性,javascript,Javascript,假设我有一个对象,其中包含另一个对象作为其属性,如 var obj = { '1': {...}, '42': {...} }; 当obj超出范围时-是否隐式销毁所有嵌套对象,或者我需要迭代它们并显式删除它们?是,除非另一个引用仍然存在: var obj = { '1': {...}, '42': {...} }; var save = obj['1']; obj = null; 在垃圾收集之后,假设没有创建其他引用,那么obj和obj['42']的空
var obj = {
'1': {...},
'42': {...}
};
当
obj
超出范围时-是否隐式销毁所有嵌套对象,或者我需要迭代它们并显式删除它们?是,除非另一个引用仍然存在:
var obj = {
'1': {...},
'42': {...}
};
var save = obj['1'];
obj = null;
在垃圾收集之后,假设没有创建其他引用,那么obj和obj['42']的空间将被恢复,保存的值当然会被保留
罪过:正如我的原件中的注释delete obj
所述,由于obj
被声明为var
,因此该注释无效。如果obj
是一个全局对象,因此是全局对象的一个属性,delete
就可以正常工作了。要有效删除var,请使用obj=null
。
通过测试我学到的一件事是
delete
操作符并返回true
或false
假设没有任何其他对象具有obj
或任何这些属性的句柄,那么它们最终应该被GC获取。通常的方法是将内容设置为null
,而不是删除它们。在处理DOM节点时要特别小心,对它们的引用可能会挂起,特别是在“certian浏览器”中。特别注意涉及DOM对象的循环引用(foo=document.body;document.body['data-blah']=foo)。是的,没有任何引用嵌套对象的内容。谢谢,如果不是删除obj,行为是否相同
I使用obj={}代码>?几乎在这一点上,为obj分配一个新值将删除对文字的引用,但它会创建一个新的文字。给它赋值undefined
更好,因为它不需要创建一个新对象来删除对旧对象的引用;删除objectFoo
是有效的(虽然,是的,我相信有一本关于javascript的著名书籍就是这样使用它的)<代码>删除用于从对象中删除属性,而不是从范围中删除变量。但汉斯·B·普法(和查克·J)的观点仍然有效。设置obj=null代码>或obj=无论什么代码>基本上做相同的事情;也就是说,删除对分配给obj
变量的对象实例的引用。@JayC:实际上它无效,我问我是否使用={}
而不是删除。好吧,谢谢你