删除删除对象或在Javascript中指定null?

时间:2014-01-17 17:25:41

标签: javascript

如何删除Javascript中的对象以正确销毁它们(如果有的话,调用析构函数?)并防止内存泄漏?我见过两种方式:

delete obj;

obj = null;

但即使在阅读this之后,我也不明白究竟是什么区别,我应该使用什么。

另外,我猜Javascript中没有真正的析构函数,但是在多个对象的复杂关系的情况下,它真的足以依赖垃圾收集器来防止内存泄漏吗?

3 个答案:

答案 0 :(得分:4)

两者之间的一个主要区别是操作后obj的值。考虑

x = 42
x = null
console.log(x)  // prints: null
delete x;
console.log(x)  // prints: undefined

分配null为现有属性提供新值。操作后它仍然存在。当您delete属性时,它将被完全删除。

答案 1 :(得分:3)

Google something to say关于delete

首选this.foo = null

Foo.prototype.dispose = function() {
  this.property_ = null;
};

而不是:

Foo.prototype.dispose = function() {
  delete this.property_;
};
  

在现代JavaScript引擎中,更改一个属性的数量   对象比重新分配值要慢得多。 delete个关键字   应避免,除非有必要移除财产   来自对象的迭代键列表,或更改if (key in obj)的结果。

修改

一些性能测试:http://jsperf.com/delete-vs-nullify

答案 2 :(得分:0)

您链接的文章说删除只会删除一个引用,因此这两者之间没有任何区别。唯一的理论差异是垃圾收集器会更有效率,因为它已被明确告知要做什么,但除非你有难以置信的大型复杂对象,在难以到达的位置有许多引用,否则它应该不是问题。

该问题的另一个答案解释了突出差异的实际用例,即。从对象中删除属性。然后,访问它会为您undefined而不是null

以下是后者的示例:http://jsfiddle.net/YPSqM/

function cat() { this.name = 'mittens'; };

var myCat = new cat();

alert(myCat.name); // 'mittens'

myCat.name = null;

alert(myCat.name === null); // 'true' as it is null but not undefined

delete myCat.name;

alert(myCat.name === undefined); // 'true' as it is undefined (but not null)