循环访问JavaScript对象 - 哪一个更快?

时间:2012-03-24 16:33:21

标签: javascript performance optimization

保存像这样的密钥名称之间的

    for(var key in this.data)
        {
            var key_name = key;
            for(key in this.data[key_name].content){
                alert(this.data[key_name].content[key].score);
            }
        }

或为每个父节点制作检查点对象

    for(var key in this.data)
        {
            var obj = this.data[key];
            for(key in obj.content){
                var  inner_obj = obj.content;
                alert(inner_obj[key].score);
            }
        }

哪一个有更好的表现?还有其他建议吗?

4 个答案:

答案 0 :(得分:5)

只有一种方法可以确定:衡量它。

http://jsperf.com/so-question-9853395

enter image description here

(点击查看最新结果)

答案 1 :(得分:4)

您应该使用两者的组合:

for(var key in this.data)
    {
        var inner_obj = this.data[key].content;
        for(ikey in inner_obj){
            alert(inner_obj[ikey].score);
        }
    }

与您提出的两个解决方案相比,这是最快的方式。

请注意,我在内部循环中将key重命名为ikey以避免混淆。

经过验证,我的解决方案确实是最快的: Proof of speed http://i.minus.com/ibqGL9wNRtcN3i.jpg

答案 2 :(得分:1)

理论上至少,最快的方法是在内循环之外获取对象引用。实际上,如果浏览器已在内部执行此操作,则差异可能不会那么大。此外,浏览器之间的性能可能会有所不同。

for(var key in this.data) {
  var obj = this.data[key].content;
  for(var key2 in obj){
    alert(obj[key2].score);
  }
}

请注意,您应该为循环使用单独的变量,否则当您在循环中放入一些实际代码时,很难跟随变量中的哪些值。

编辑:

当我在IE和Firefox中measure the performance时,我发现这种方法比问题中提出的方法稍快一些。但是,差异太小,你不应该关心它。这两种方法都可以正常工作,任何性能问题都与内部循环中的值实际有关。

答案 3 :(得分:0)

从代码解释器的角度来看,第一个应该更快。在第二个示例中,您必须访问this.data数组。

在现代浏览器中,您可能拥有一个很好的即时编译器。如果这是真的,那么这个JIT可能会在完全相同的操作码中“翻译”你的代码。

所以你必须通过多次执行代码(我的意思是数千次)在不同的浏览器中进行测试并测量执行时间。

如果您的浏览器中没有JIT编译器,则更快速。

var data = this.data
for(var keyA in data)
    {
        var content = data[keyA].content;
        for(keyB in content){
            alert(content[keyB].score);
        }
    }