什么时候我应该在JavaScript中使用delete vs setting元素为null?

时间:2009-12-22 17:40:13

标签: javascript garbage-collection

  

可能重复:
  Deleting Objects in JavaScript

我有一个具有大量属性的JS对象。如果我想强制浏览器垃圾收集这个对象,我是否需要将每个属性设置为null或者我是否需要使用delete运算符?这两者有什么区别?

3 个答案:

答案 0 :(得分:145)

没有办法在JavaScript中强制进行垃圾收集,而你真的不需要。 x.y = null;delete x.y;都消除了xy之前值的引用。必要时,该值将被垃圾收集。

如果您将某个属性归零,它仍会被视为对象的“设置”并将被枚举。我唯一能想到您希望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

答案 1 :(得分:16)

Javascript对象属性通常使用哈希表实现。设置为null会使哈希表中的键指向空值,而删除会删除键和值。

两者之间的主要可观察差异是,如果使用for..in循环迭代键,删除键会导致迭代所看到的条目更少。

我建议一般情况下更喜欢删除,除非您要重复设置和清除相同的密钥,这样会使哈希表结构保持原位。但是,在任何典型情况下,这两种技术之间的任何性能差异都将是无法估量的。

-m @

答案 2 :(得分:1)

无法在JavaScript中的特定时间强制进行垃圾回收。每个JavaScript引擎都有自己的处理方式。

但是,您可以做的是确保您的对象不会被引用到任何地方。将它们设置为null或删除它们实际上是在做同样的事情(删除永远不会删除对象 - 它只删除对它的引用)。当垃圾收集运行时,它会检查是否有对给定对象的任何引用 - 如果没有,则将其从内存中删除。这是发生内存泄漏的地方(JavaScript对象引用DOM对象,反之亦然)。

确保删除所有引用,你会没事的。