【问题标题】:Why is there an extra variable in this javascript function?为什么这个 javascript 函数中有一个额外的变量?
【发布时间】:2015-10-13 03:08:00
【问题描述】:

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

【问题讨论】:

  • 请重新表述您的问题。我认为它不应该包含“ANSWER”,因为这是本网站的目的(Q&A)。此外,以谈论缓存和性能的方式重新表述它,因为现在标题看起来像一个调试问题。为什么约定是一个标签?缓存呢?
  • 我知道开放式讨论很糟糕,但我不认为“是否有像 python PEP 这样的最佳实践的主要来源”(我现在已经删除)是一个开放式问题.
  • 这可能不是开放式的,但它违反了另一个规则(来自here 的#4):“要求我们推荐或查找书籍、工具、软件库的问题、教程或其他场外资源与 Stack Overflow 无关” 坚持询问编程问题本身。
  • 一手资料可以看my search query for JS style guides。 Mozilla Dev Network 有很好的网络技术指南。此外,优秀的书籍是 Eloquent JS。如需其他资源,请查看herehere
  • 您不应使用新问题来编辑您的问题。如果您有新问题,您应该发布一个新问题。您已经接受了答案,如果您更改问题,则发布的答案毫无意义。此外,您将无法为新问题选择新答案。

标签: javascript caching


【解决方案1】:

可能是因为 g[i] 需要索引到数组中反复查找对象的属性,而将值存储在 o 中会缓存该值一次,以便随后更快地访问。

【讨论】:

  • 由于您将对象存储在gc[i] 中,然后将对象引用存储在o 中,因此您对同一个对象进行操作,它最终与您的代码完全相同。只有更有效率。
  • 其实gc不是数组,所以这不是数组索引而是简单的属性查找。
  • 您(甚至@TedHopp)能否详细说明并纠正此答案中的错误?还要添加一些代码格式
【解决方案2】:

这是一个(次要的)性能增强。它将三个下标操作替换为一个局部变量赋值和三个局部变量访问。我怀疑性能改进是否会很明显。 请参阅this thread 了解有关各种数组操作的性能的更多信息。(实际上,该信息有些无关紧要,因为gc 是一个对象,而不是数组。这些是普通的旧属性查找被保存,而不是数组索引,所以性能提升可能会更显着。)

【讨论】:

    【解决方案3】:

    因为它必须不断地通过索引重新寻找数组中的项目。 o 将对该位置的引用存储在内存中,以便以后访问更快。

    【讨论】:

      【解决方案4】:

      更简单

      改变

              gc[i] = gc[i] || (gc[i] = {x:0,y:0,count:0});
      

              gc[i] = gc[i] || {x:0,y:0,count:0};
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-10-20
        • 2018-12-29
        • 2011-12-28
        • 2016-09-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多