可能的复制品: 在 JavaScript 中删除对象
我有一个具有大量属性的 JS 对象。如果我想强制浏览器垃圾收集这个对象,我需要设置每个属性为空还是我需要使用删除操作符?这两者有什么区别?
在 JavaScript 中无法强制在特定时间进行垃圾收集。每个 JavaScript 引擎都有自己的处理方式。
但是,您可以做的是确保您的对象没有在任何地方被引用。将它们设置为 null 或删除它们实际上是在做同样的事情(delete 从不删除对象——它只删除对它的引用)。当垃圾收集运行时,它检查是否有任何对给定对象的引用——如果没有,则从内存中删除该对象。这就是内存泄漏发生的地方(JavaScript 对象引用 DOM 对象,反之亦然)。
确保你删除了所有的引用,你就没事了。
在 JavaScript 中没有强制垃圾收集的方法,而且实际上也不需要这样做。x.y = null;和 delete x.y;都消除了 x对 y前值的参考。必要时将对该值进行垃圾回收。
x.y = null;
delete x.y;
x
y
如果您取消了一个属性,它仍然被认为是对象上的“设置”,并将被枚举。我唯一能想到的选择 delete的地方是,如果要枚举 x的属性。
delete
考虑以下几点:
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
Javascript 对象属性通常使用散列表实现。设置为 null 将使散列表中的键指向 null 值,而 delete 将消除键和值。
The main observable difference between the two is that if you iterate over the keys with a for..in loop, deleting keys results in fewer entries seen by the iteration.
我建议一般情况下更倾向于删除,除非您要重复设置和清除相同的键,这会导致保留哈希表结构不变。然而,在任何典型情况下,这两种技术之间的任何性能差异都将是无法测量的。
- 是的