Javascript 在for循环的情况下是否多次调用属性?

Javascript 在for循环的情况下是否多次调用属性?,javascript,optimization,Javascript,Optimization,一位程序员告诉我,当编码循环时,如果在条件部分添加了一个属性,那么它将在每次迭代中计算 例: 这可能在小名单上都看不到 这些都是真的吗?有没有办法检查这个?可能这可以用定时器来检查,但我想知道这是否是一种已知的行为。是的,这是真的,但性能提升非常低。 对循环使用时的一个优化是在循环外部的变量中指定数组的长度属性,以避免引擎在每次迭代中计算数组的长度 但是性能增益很低,只有在非常大的阵列中才能看到 这是一个很好的做法,尽管总是使用它,无论大小只是为了“安全”的一面 请记住,随着时间的推移,JS引擎

一位程序员告诉我,当编码循环时,如果在条件部分添加了一个属性,那么它将在每次迭代中计算

例:

这可能在小名单上都看不到


这些都是真的吗?有没有办法检查这个?可能这可以用定时器来检查,但我想知道这是否是一种已知的行为。

是的,这是真的,但性能提升非常低。 对循环使用时的一个优化是在循环外部的变量中指定数组的长度属性,以避免引擎在每次迭代中计算数组的长度

但是性能增益很低,只有在非常大的阵列中才能看到

这是一个很好的做法,尽管总是使用它,无论大小只是为了“安全”的一面

请记住,随着时间的推移,JS引擎正在变得越来越好,编译器正在进行许多更好的优化,一些“实践”已经存在。这意味着,如果在循环外部分配Length属性此时提供了一个小的性能增益,那么很快这可能不是真的。
看看这个,它会提供一些关于你的案例的信息:

是的这是真的。计算将在每次迭代中重复

正如你所看到的,在过去,它产生了巨大的变化。然而,如今这种差异已经小得多了

这让我好奇,所以我做了一些测试。看起来:

  • Chrome和Firefox(最新版本)在这两种方法之间几乎没有区别
  • 在IE(8,9,10,11,Edge)中,差异更为明显(同样在Edge中)。另一件有趣的事情是,与Chrome和Firefox相比,IE中的循环需要更多的时间
  • IE中方法之间的平均差异:

    请记住,只有非常大的阵列才有明显的差异

    最好的方法总是自己测试。我添加了基本代码。运行多次并计算平均值以获得准确的结果

    //支持旧浏览器的性能填充
    (功能(){
    如果(窗口中的“性能”==false){
    window.performance={};
    }
    Date.now=(Date.now | |函数(){//IE8
    返回新日期().getTime();
    });
    if(window.performance==false中的“现在”){
    var nowOffset=Date.now();
    if(performance.timing&&performance.timing.navigationStart){
    nowOffset=performance.timening.navigationStart
    }
    window.performance.now=函数now(){
    返回日期.now()-nowOffset;
    }
    }
    })();
    var元素=[];
    var计数=0;
    而(计数<10000000){
    元素。push(count++);
    }
    arrlength=elements.length;
    var t0=performance.now();
    //长度为
    对于(var i=0;i
    
    请参见console中的详细信息
    出于性能考虑,始终建议在循环中记忆数组长度。我认为不应该这样做,因为与它带来的风险相比,收益是微不足道的。有一个警告。如果在循环期间和整个循环过程中变形数组(通过插入或删除项目),那么如果在每一轮中不使用正确的数组长度属性,那么对长度的引用可能会欺骗您

    好了,下面的投票人来了。。。如您所见,如果添加了一个项目,则具有Memomeized length属性的下一个项目将无法一直计数到最后,如果删除了一个项目,则将尝试进行过多计数并返回不存在的未定义项目

    var a=[1,2,3,4,5],
    l=a.长度;
    对于(变量i=0;i}
    如果在循环期间和整个循环过程中变形数组(通过插入或删除项)
    这是没有意义的。在迭代时修改数组从来都不是一个好主意。
    var elements=['a','b','c','d'] // imagine a very long list
    
    for (var i=0; i < elements.length; i++) { // <- Here is array.length being called
        var element = elements[i]
    }
    
    var elements=['a','b','c','d'] // imagine a very long list
    var elements_length=elements.length
    
    for (var i=0; i < elements_length; i++) { // <- Here is array.length being called
        var element = elements[i]
    }