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规范保证.
由于clientColors[client.sessionId]在本例中 是一个原始值(字符串),因此它将立即被清除。
让我们考虑更复杂的情况,即foo[bar] = owitho是非原始对象(某个对象)。重要的是要理解它o不是存储在“内部” foo,而是存储在任意内存位置的某个位置。foo仅保存指向该位置的指针。当您调用 时delete foo[bar],该指针将被清除,并且由垃圾收集器来释放 所占用的内存o。
Array顺便说一句:当您需要关联数组时不应该使用。后者Object在 Javascript 中调用,通常使用简写准字面量来实例化{}