这个问题在这里已经有了答案:12 年前关闭。
可能重复:在 JavaScript 中删除对象
我有一个具有大量属性的 JS 对象。如果我想强制浏览器垃圾收集这个对象,我需要将这些属性中的每一个都设置为 null 还是需要使用 delete 运算符?两者有什么区别?
delete
仅从对象中删除一个属性(相对于为属性赋予 null 值)。假设您没有对您的对象的外部引用,它将被垃圾收集不管您是否先清空或删除属性。
没有办法在 JavaScript 中强制进行垃圾收集,而且您也不需要这样做。 x.y = null;
和 delete x.y;
都消除了 x
对 y
以前值的引用。该值将在必要时被垃圾收集。
如果您将某个属性设为空,它仍会被视为对象上的“设置”并会被枚举。我能想到的唯一一次您更喜欢 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 对象属性通常使用哈希表实现。设置为 null 会使哈希表中的键指向一个空值,而 delete 会同时消除键和值。
两者之间可观察到的主要区别在于,如果您使用 for..in 循环对键进行迭代,则删除键会导致迭代中看到的条目更少。
我建议通常更喜欢删除,除非您要重复设置和清除相同的键,否则会争论保留散列表结构。但是,在任何典型情况下,这两种技术之间的任何性能差异都将非常小。
-m@
在 JavaScript 中,没有办法在特定时间强制进行垃圾回收。每个 JavaScript 引擎都有自己的处理方式。
但是,您可以做的是确保您的对象没有在任何地方被引用。将它们设置为 null 或删除它们实际上是在做同样的事情(删除永远不会删除对象 - 它只会删除对它的引用)。当垃圾收集运行时,它会检查是否有对给定对象的任何引用——如果没有,它将从内存中删除它。这就是发生内存泄漏的地方(JavaScript 对象引用 DOM 对象,反之亦然)。
确保删除所有引用,你会没事的。
不定期副业成功案例分享