在属性上使用delete时的Javascript对象内存管理

Moo*_*oop 6 javascript node.js socket.io

我目前正在编写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];
    });
});
Run Code Online (Sandbox Code Playgroud)

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

我对吗?

Ray*_*nos 12

delete clientColors[client.sessionId];

这将删除对象上对象的引用clientColors.v8垃圾收集器将拾取任何对垃圾收集引用的对象.

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

看到你删除了唯一的引用,该属性也将消失.另请注意,javascript中的对象不是"关联数组",因为排序是特定于实现的,而不是由ES规范保证.


use*_*621 5

由于clientColors[client.sessionId]在本例中 是一个原始值(字符串),因此它将立即被清除。

让我们考虑更复杂的情况,即foo[bar] = owitho是非原始对象(某个对象)。重要的是要理解它o不是存储在“内部” foo,而是存储在任意内存位置的某个位置。foo仅保存指向该位置的指针。当您调用 时delete foo[bar],该指针将被清除,并且由垃圾收集器来释放 所占用的内存o

Array顺便说一句:当您需要关联数组时不应该使用。后者Object在 Javascript 中调用,通常使用简写准字面量来实例化{}