如何在for(prop in obj)循环中分配内存以及最佳方法是什么

时间:2015-05-29 07:41:00

标签: javascript

我有以下代码段

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对象被重用了?

什么是最好的行动方案?

我确实意识到我们正在谈论速度差异的微秒,我只是对幕后的"感兴趣"动作,就像内存分配/重用的方式,以及最好的记忆方式。

1 个答案:

答案 0 :(得分:2)

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

owners

表示“在当前范围内查找prop,然后在其中找到属性prop,然后找到一个插槽prop2”。由于JavaScript用于定位属性的复杂规则,它很昂贵。

第二个问题是拼写错误。如果将这些复杂表达式压缩为局部变量,则可以减少拼写错误的可能性。想象一下有人用win取代null并且错过了三分之一 - 这实际上发生了很多。

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

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