如何在for(prop in obj)循环中分配内存,最好的方法是什么
How does memory get allocated in a for(prop in obj) loop and what is the best approach
我有以下代码片段
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
或将整个代码包装在函数中以确保它已被清理,这可能是明智的。
相关文章:
- Javascript内存分配
- Javascript是否为具有未定义值的变量分配32位内存
- 使用模块模式时分配了多少内存
- JavaScript 中的堆和本机内存分配:如何管理
- 分配更多内存 Cucumber-js
- 节点为数组中的空值分配多少内存
- 事件处理程序分配和内存泄漏
- JSON 树和内存分配
- JavaScript 类型的内存分配
- 为阵列分配内存
- 是否可以加载图像,在内存中缩放它并将其分配为背景图像的 uri
- Javascript 类、编译器性能和新 Klass() 上的内存分配
- 画布路径内存分配
- 内存分配和DOM元素
- Chrome在使用单页应用程序时增加系统内存分配
- 致命错误:CALL_AND_RETRY_2分配失败-进程在预处理我的js字段时内存不足
- 删除缓存文件并以编程方式释放为其分配的内存
- 如何检测在JavaScript中触发垃圾收集的内存分配
- Javascript 数组的内存分配
- JavaScript中字符串和数组的内存分配