什么时候应该使用删除vs设置元素在JavaScript中为null?

可能重复:
在JavaScript中删除对象

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

没有办法强制垃圾收集在JavaScript中,你并不需要。 xy = null;delete xy; 既消除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 

Javascript对象的属性通常用一个hashtable来实现。 设置为null会将散列表中的键指向一个空值,而删除则会消除键和值。

两者之间主要的可观察的区别在于,如果使用for..in循环迭代键,则删除键会导致迭代出现更less的条目。

我会build议宁愿删除一般,除非你要重复设置和清除相同的密钥,这将争论离开哈希表结构。 但是,在任何典型情况下,这两种技术之间的性能差异都将小得无法估量。

-m @

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

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

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