我有一个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
。
有没有其他方法可以将所有参数提取到数组中,但是前两个参数,不使用显式循环,并且不会降低效率?
答案 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]);
});
}