可能有重复:
JavaScript中删除对象
我有一个JS对象,它有大量的属性。如果我想强制浏览器垃圾回收这个对象,我需要将这些属性都设置为null吗?还是我需要使用delete运算符?两者之间有什么区别?
可能有重复:
JavaScript中删除对象
我有一个JS对象,它有大量的属性。如果我想强制浏览器垃圾回收这个对象,我需要将这些属性都设置为null吗?还是我需要使用delete运算符?两者之间有什么区别?
在JavaScript中,没有办法强制进行垃圾回收,而且你实际上也不需要这样做。 x.y = null;
和 delete x.y;
都会消除x
对y
之前值的引用。当必要时,该值将被垃圾回收。
如果你将属性设置为null,它仍然被视为对象上“已设置(set)”的属性,因此会被枚举(enumerate)。 我唯一能想到的情况是,如果你要枚举x
的属性,那么你可能更喜欢使用delete
。
考虑以下示例:
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会使哈希表中的键指向null值,而delete操作会同时删除键和值。
两者之间的主要区别在于,如果使用for..in循环迭代键,删除键将导致迭代看到的条目数量减少。
一般建议使用删除操作,除非您将反复设置和清除相同的键,这会导致哈希表结构保持不变。但是,在任何典型情况下,使用这两种技术之间的性能差异都无法衡量。
-m@
delete
仅从对象中删除属性(而不是将属性的值设置为null)。假设您没有对对象的外部引用,则无论您首先是否清空或删除属性,它都将被垃圾回收。 - Shog9