我是一个javascript新手,我无法弄清楚为什么变量o
存在于以下代码中:
var data = [ {"name":"alice", "group":1}, {"name":"bob", "group":2} ];
function getGroup(n) { return n.group; }
function network(nodes, index) {
var gc = {};
nodes.forEach(function(n) {
var i = index(n), o;
if (condition) {
o = gc[i] || (gc[i] = {x:0,y:0,count:0});
o.x += n.x;
o.y += n.y;
o.count += 1;
}
});
}
var net = network(nodes, getGroup)
在我看来,network
函数中的迭代器会以这种方式编写得更好:
function network(data, index) {
var gc = {};
nodes.forEach(function(n) {
var i = index(n);
if (condition) {
gc[i] = gc[i] || (gc[i] = {x:0,y:0,count:0});
gc[i].x += n.x;
gc[i].y += n.y;
gc[i].count += 1;
}
});
}
我认为第二个循环是等价的,它消除了一个变量(我更容易阅读)。是第一个版本遵循javascript中的一些推荐做法?我可以想象,在迭代器中使用var o;
以减小其范围是一种好习惯,但在这种情况下o
仅引用已由gc[i]
引用的对象。为什么不消除它?
答案 0 :(得分:3)
可能因为g [i]需要索引到数组重复查找对象的属性,而将值存储在o中会将值缓存一次并随后提供更快的访问。
答案 1 :(得分:1)
这是(次要)性能增强。它使用局部变量赋值和三个局部变量访问来替换三个下标操作。我怀疑性能改进是否会引人注目。 有关各种数组操作性能的更多信息,请参阅this thread。(实际上,该信息有点不相关,因为gc
是一个对象,而不是数组。这些都是普通的保存属性查找,而不是数组索引,因此性能提升可能会更加重要。)
答案 2 :(得分:1)
更简单
变化
gc[i] = gc[i] || (gc[i] = {x:0,y:0,count:0});
到
gc[i] = gc[i] || {x:0,y:0,count:0};
答案 3 :(得分:0)
因为它必须通过索引继续重新搜索数组中的项目。 o存储对内存中位置的引用,以便以后更快地访问。