复制arguments对象的子集,而不使用显式循环

时间:2011-05-05 16:41:31

标签: javascript jquery coding-style

我有一个JavaScript函数,它接受两个必需参数,然后任意多个可选参数。

function myFunction(required1, required2) {
    var more = [];
    for (var i = 2; i < arguments.length; ++i)
        more.push(arguments[i]);
    // ...
}

现在,我喜欢通过我的所有代码强制执行一致的样式。由于我的网站使用jQuery,并且jQuery倾向于使用$.each$.map而不是显式循环,我想摆脱myFunction中的显式循环。但是,我不能使用$.each$.map,因为我不想复制整个参数列表,以免我执行以下操作:

var more = $.map(arguments, function(argument, index) {
    return (index < 2) ? null : [argument];
});

当然,这是一个非常糟糕的主意,因为测试每次迭代中是否index < 2是不必要的。

我真的希望能够使用标准函数将arguments对象的子集提取到新数组中。但是,因为arguments不是数组,所以我不能slice

有没有其他方法可以将所有参数提取到数组中,但是前两个参数,不使用显式循环,并且不会降低效率?

2 个答案:

答案 0 :(得分:10)

使用slice方法:

var optional_arguments = Array.prototype.slice.call(arguments, 2);

我们必须从Array.prototype调用它,因为即使arguments类似于数组,它实际上也没有slice方法。

答案 1 :(得分:2)

函数的参数可以像jQuery一样对待,例如以下工作完全正常:

function something(ar1,ar2){
    var args = $(arguments).slice(2);
    $(args).each(function(i){
        $('#stuff').append(args[i]+'<br />');
    });
}
$(function(){
    something('one','two','three','four');
});

要根据你的功能进行定制,它看起来像这样:

function myFunction(required1, required2) {
    var more = [];
    var args = $(arguments).slice(2);
    $(args).each(function(i){
        more.push(args[i]);
    });
}