我啥时候应该在 JavaScript 中使用 delete vs 将元素设置为 null? [复制]

Posted

技术标签:

【中文标题】我啥时候应该在 JavaScript 中使用 delete vs 将元素设置为 null? [复制]【英文标题】:When should I use delete vs setting elements to null in JavaScript? [duplicate]我什么时候应该在 JavaScript 中使用 delete vs 将元素设置为 null? [复制] 【发布时间】:2010-12-29 05:06:22 【问题描述】:

可能重复:Deleting Objects in javascript

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

【问题讨论】:

见***.com/questions/742623/…和***.com/questions/1596782/… @jeffreyveon:答案可以在对 Crescent Fresh 链接的第一个问题的回复中找到,但在您阅读之前我会在这里总结一下:您不能“强制”浏览器垃圾收集任何东西; delete 只是从对象中删除一个属性(相对于为属性赋予 null 值)。假设您没有对您的对象的外部引用,它将被垃圾收集不管您是否先清空或删除属性。 【参考方案1】:

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

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

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

【讨论】:

“每个 JavaScript 引擎都有自己的处理方式” - 不完全准确,据此,所有现代浏览器都使用“标记和扫描”算法的变体,自 2012 年以来:@987654321 @ @NoBugs 我想这就是他的意思。 “他们自己的处理方式”===“一种变体”......【参考方案2】:

在 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

【讨论】:

JavaScript 就是这样一种奇特的语言。我觉得奇怪的一件事是 for 循环中的变量在循环后不会超出范围。在您的代码中,您不需要重新定义“key”,因为“key”已经定义。我告诉你很奇怪。完全控制是令人沮丧的。实际上我以前从未听说过这个删除关键字。我总是清空变量,因为我可能不小心在其他地方定义了它,而且我不知道解析器(或使用 IE 的用户!)。感谢您分享您的知识。 @pqsk 你提到的 for 循环是变量提升的一个实例。一旦你把头绕在它周围,它实际上很酷! jsfiddle.net/a4awzxd7/1 @catalyst294 好吧,你可以说它很酷,但这也是为什么有这么多乱七八糟的javascript代码的主要原因。如果编写代码的人不完全了解缺少范围,这也可能导致意外行为。【参考方案3】:

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

两者之间可观察到的主要区别在于,如果您使用 for..in 循环对键进行迭代,删除键会导致迭代中看到的条目更少。

我建议总体上更喜欢删除,除非您要重复设置和清除相同的键,否则会争论保留哈希表结构。但是,在任何典型情况下,这两种技术之间的任何性能差异都会非常小。

-m@

【讨论】:

以上是关于我啥时候应该在 JavaScript 中使用 delete vs 将元素设置为 null? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该在独立的 node.js 上使用 express.js

我啥时候应该在 C 中使用 malloc,啥时候不应该?

我啥时候应该在 C 中使用 malloc,啥时候不应该?

我啥时候应该在 C++ 中使用 typedef?

我啥时候应该使用 FutureBuilder?

我啥时候应该在 PL/SQL 中使用过程或函数?