可能重复:
Deleting Objects in JavaScript
我有一个具有大量属性的JS对象。如果我想强制浏览器对此对象进行垃圾回收,是否需要将这些属性中的每一个都设置为null,或者是否需要使用delete操作符?这两者有什么不同?
发布于 2009-12-23 02:04:54
在JavaScript中没有强制垃圾收集的方法,您也不需要这样做。x.y = null;
和delete x.y;
都会消除x
对y
前一个值的引用,必要时会对该值进行垃圾回收。
如果你将一个属性置为空,它仍然被认为是对象上的'set‘,并且会被枚举。我能想到的唯一一次你更喜欢delete
的地方是当你要枚举x
的属性时。
请考虑以下几点:
var foo = { 'a': 1, 'b': 2, 'c': 3 };
console.log('Deleted a.');
delete foo.a
for (var key in foo)
console.log(key + ': ' + foo[key]);
console.log('Nulled out b.');
foo['b'] = null;
for (var key in foo)
console.log(key + ': ' + foo[key]);
此代码将生成以下输出:
Deleted a.
b: 2
c: 3
Nulled out b.
b: null
c: 3
发布于 2009-12-23 02:44:09
Javascript对象属性通常使用哈希表实现。设置为null会使哈希表中的键指向空值,而delete会同时删除键和值。
两者之间的主要可观察区别在于,如果使用for..in循环迭代键,删除键会导致迭代看到的条目更少。
我建议通常倾向于删除,除非您要重复设置和清除相同的键,这会主张保留哈希表结构。然而,在任何典型情况下,这两种技术之间的任何性能差异都是非常小的。
-m@
发布于 2009-12-23 01:50:49
在JavaScript中,无法在特定时间强制垃圾收集。每个JavaScript引擎都有自己的处理方式。
但是,您可以做的是确保您的对象没有在任何地方被引用。将它们设置为null或删除它们实际上是在做同样的事情(delete永远不会删除对象-它只会删除对它的引用)。当垃圾收集运行时,它检查是否有任何对给定对象的引用-如果没有,则将其从内存中删除。这就是发生内存泄漏的地方( JavaScript对象引用DOM对象,反之亦然)。
确保你删除了所有的引用,你就会好起来的。
https://stackoverflow.com/questions/1947995
复制相似问题