为什么这个javascript函数中有一个额外的变量?

时间:2015-07-23 01:28:05

标签: javascript caching

我是一个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]引用的对象。为什么不消除它?

4 个答案:

答案 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存储对内存中位置的引用,以便以后更快地访问。