如何删除Javascript中的对象以正确销毁它们(如果有的话,调用析构函数?)并防止内存泄漏?我见过两种方式:
delete obj;
和
obj = null;
但即使在阅读this之后,我也不明白究竟是什么区别,我应该使用什么。
另外,我猜Javascript中没有真正的析构函数,但是在多个对象的复杂关系的情况下,它真的足以依赖垃圾收集器来防止内存泄漏吗?
答案 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)
的结果。
修改
答案 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)