javascript functions and arguments object, is there a cost involved

后端 未结 4 1759
北恋
北恋 2020-12-25 14:24

It is common place to see code like that around the web and in frameworks:

var args = Array.prototype.slice.call(arguments);

In doing so, you

4条回答
  •  独厮守ぢ
    2020-12-25 15:09

    I would argue against the accepted answer.
    I edited the tests, see here: http://jsperf.com/arguments-performance/6
    I added the test for slice method and a test for memory copy to preallocated array. The latter is multiple times more efficient in my computer.
    As You can see, the first two memory copy methods in that performance test page are slow not due to loops, but due to the push call instead.
    In conclusion, the slice seems almost the worst method for working with arguments (not counting the push methods since they are even not much shorter in code than the much more efficient preallocation method).
    Also it might be of interest, that apply function behaves quite well and does not have much performance hit by itself.

    First existing test:

    function f1(){
        for(var i = 0, l = arguments.length; i < l; i++){
            res.push(arguments[i])
        }
    }
    

    Added tests:

    function f3(){
        var len = arguments.length;
        res = new Array(len);
        for (var i = 0; i < len; i++)
             res[i] = arguments[i];
    }
    
    function f4(){
        res = Array.prototype.slice.call(arguments);
    }
    
    function f5_helper(){
        res = arguments;
    }
    function f5(){
        f5_helper.apply(null, arguments);
    }
    
    function f6_helper(a, b, c, d){
        res = [a, b, c, d];
    }
    function f6(){
        f6_helper.apply(null, arguments);
    }
    

提交回复
热议问题