使用属性上的删除时,Javascript对象内存pipe理

我目前正在编写一个node.js / socket.io应用程序,但问题是一般的JavaScript。

我有一个关联数组为每个客户端连接存储颜色。 考虑以下:

var clientColors = new Array(); //This execute each new connection socket.on('connection', function(client){ clientColors[client.sessionId] = "red"; //This execute each time a client disconnect client.on('disconnect', function () { delete clientColors[client.sessionId]; }); }); 

如果我使用删除语句,我担心它会造成内存泄漏,因为以client.sessionId值命名的属性(关联数组是对象)不会被删除,其引用的值将变成gonne,但属性仍然会存在于对象中。

我对吗?

delete clientColors[client.sessionId];

这将删除对象clientColors上的对象的引用。 v8垃圾收集器将会拾取任何具有引用的对象来进行垃圾回收。

现在,如果您问是否在IE4中创build了内存泄漏,那么这是一个不同的问题。 另一方面,v8可以轻松处理这个问题。

看到你删除唯一的参考财产也将消失。 还要注意,对象不是JavaScript中的“关联数组”,因为sorting是特定于实现的,而不是ES规范所允许的。

由于在这种情况下clientColors[client.sessionId]是一个原始值(一个string),它将被立即清除。

让我们考虑foo[bar] = o更复杂的情况, o是非原始的(某个对象)。 重要的是要明白, o不是存储在foo内部,而是存储在任意内存位置。 foo只是持有指向该位置的指针。 当你调用delete foo[bar] ,该指针被清除,并由垃圾收集器来释放o所占用的内存。

顺便说一句:你不应该使用Array当你想要一个关联数组。 后者在Javascript中被称为Object ,并且通常使用短文准文字{} short-hand quasi literal)来实例化。

如果您使用V8引擎或nodejs / io,它可能不会导致泄漏,但总是build议防止泄漏。

只要删除它

 delete clientColors[client.sessionId]; 

或者将其设置为null

 clientColors[client.sessionId] = null; 

哪些还会级联到任何原型inheritance的对象。

这样几乎没有发生泄漏的可能性。