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

jef*_*eon 66 javascript garbage-collection

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

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

Ann*_*lle 149

没有办法强制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]);
Run Code Online (Sandbox Code Playgroud)

此代码将生成以下输出:

Deleted a.
b: 2
c: 3
Nulled out b.
b: null
c: 3
Run Code Online (Sandbox Code Playgroud)


小智 17

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

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

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

-m @