每次比较我和array.length时,Do循环是否检查array.length?

我正在浏览,我发现这一点:

var i, len;
for(i = 0, len = array.length; i < len; i++) {  
   //...
}

我的第一个想法是:

  • 他为什么这么做? (由于某种原因,它一定会更好)
  • 这值得么? (我想是的,为什么他会这样做?)
  • 做正常的循环(那些不缓存长度的循环)每次检查array.length


    由三部分组成的循环执行如下:

    for (A; B; C)
    
    A - Executed before the enumeration
    B - condition to test
    C - expression after each enumeration (so, not if B evaluated to false)
    

    所以,是的:如果数组的构造方式for(var i=0; i<array.length; i++)则在每个枚举处检查数组的.length属性。 对于微型优化,将一个数组的长度存储在一个临时变量中是有效的(另请参阅:在JavaScript中循环数组的最快方式是什么?)。

    等同for (var i=0; i<array.length; i++) { ... }

    var i = 0;
    while (i < array.length) {
        ...
        i++;
    }
    

    Is it worth it? (obviously yes, why else he will do it this way?)

    绝对没错。 因为,正如你所说,循环会每次计算数组长度。 所以这会造成巨大的开销。 在firebug或chrome dev工具中运行以下代码片段

    // create an array with 50.000 items
    (function(){
        window.items = [];
        for (var i = 0; i < 50000; i++) {
            items.push(i);
        }
    })();
    
    // a profiler function that will return given function's execution time in milliseconds
    var getExecutionTime = function(fn) {
        var start = new Date().getTime();
        fn();
        var end = new Date().getTime();
        console.log(end - start);
    }
    
    var optimized = function() {
        var newItems = [];
        for (var i = 0, len = items.length; i < len; i++) {
            newItems.push(items[i]);
        }
    };
    
    
    var unOptimized = function() {
        var newItems= [];
        for (var i = 0; i < items.length; i++) {
            newItems.push(items[i]);
        }
    };
    
    getExecutionTime(optimized);
    getExecutionTime(unOptimized);
    

    以下是各种浏览器中的近似结果

    Browser    optimized    unOptimized
    Firefox    14           26
    Chrome     15           32
    IE9        22           40
    IE8        82           157
    IE7        76           148 
    

    所以再考虑一下,并使用优化方式:)
    注意:我试图在jsPerf上使用此代码,但现在无法访问jsPerf。 我想,当我尝试时,它会下降。


  • 如果array.length是一个计算值(在您的示例中不太可能),那么最好一次检索该值并将其存储在变量中。

  • 如果array.length没有被计算(在你的例子中可能是这种情况),那么检索长度并将其存储在变量中是没有价值的。

  • 链接地址: http://www.djcxy.com/p/59045.html

    上一篇: Do loops check the array.length every time when comparing i against array.length?

    下一篇: Unable to set data attribute using jQuery Data() API