Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/drupal/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 垃圾收集:对象属性_Javascript - Fatal编程技术网

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:实际上它无效,我问我是否使用
={}
而不是
删除
。好吧,谢谢你