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);
}
}
哪一个有更好的表现?还有其他建议吗?
答案 0 :(得分:5)
答案 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);
}
}