我有以下代码段
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
对象被重用了?
什么是最好的行动方案?
我确实意识到我们正在谈论速度差异的微秒,我只是对幕后的"感兴趣"动作,就像内存分配/重用的方式,以及最好的记忆方式。
答案 0 :(得分:2)
第二个循环更快,因为它不会一遍又一遍地遍历同一个对象。
owners
表示“在当前范围内查找prop
,然后在其中找到属性prop
,然后找到一个插槽prop2
”。由于JavaScript用于定位属性的复杂规则,它很昂贵。
第二个问题是拼写错误。如果将这些复杂表达式压缩为局部变量,则可以减少拼写错误的可能性。想象一下有人用win
取代null
并且错过了三分之一 - 这实际上发生了很多。
最后,它使代码更具可读性,而且你可以使用这种方法来表达意图,给变量一个名称来解释它为什么存在。
记忆明智,差异并不大。即使{{1}}处于全局级别,它也只是对现有对象的引用(=几个字节)。但它可能会导致泄漏。因此,在循环之后将其设置为{{1}}或将整个代码包装在函数中以确保它已被清理可能是明智的。