如何在for(prop in obj)循环中分配内存,最好的方法是什么

How does memory get allocated in a for(prop in obj) loop and what is the best approach

本文关键字:内存 分配 是什么 方法 循环 for prop obj in      更新时间:2023-09-26

我有以下代码片段

for(var prop in windowManager.owners) {
    if(windowManager.owners.hasOwnProperty(prop)) {
        if(windowManager.owners[prop] instanceof WhatAmILookingFor) {
            if(windowManager.owners[prop].id=== lookupid) {
                return windowManager.owners[prop];
            }
        }
    }
}

将对windowManager.owners[prop]的引用存储在像这样的临时变量中会更好吗?

var win = null;
for(var prop in windowManager.owners) {
    if(windowManager.owners.hasOwnProperty(prop)) {
        win = windowManager.owners[prop];
        if(win instanceof WhatAmILookingFor) {
            if(win.id === lookupid) {
                return win;
            }
        }
    }
}

这样做有好处吗?这样做会有gc开销吗?或者它对gc没有影响,因为win对象被重用了?

最好的做法是什么?

我确实意识到我们在这里谈论的是微秒的速度差异,我只是对"幕后"的行为感兴趣,就像内存被分配/重用的方式,以及什么是最好的内存实践。

第二个循环更快,因为它不会反复遍历同一个对象。

windowManager.owners[prop]

表示"在当前作用域中查找windowManager,然后找到属性owners,然后在其中找到插槽prop"。因为JavaScript使用复杂的规则来定位属性,所以它是昂贵的。

第二个问题是打字错误。如果将这些复杂的表达式压缩到一个局部变量中,就可以减少出现错别字的可能性。想象一下,有人用prop2代替prop,三分之一的错误——这种情况实际上经常发生。

最后,它使代码更具可读性,而且你可以使用这种方法通过给变量一个名字来解释它为什么在那里来表达意图。

内存方面,差异并不是那么大。即使win处于全局级别,它也只是对现有对象的引用(=几个字节)。但这可能会导致泄漏。因此,在循环后将其设置为null或将整个代码包装在函数中以确保它已被清理,这可能是明智的。