如果我有一个函数,我可以使用arguments
变量转发所有参数。
现在我有一个函数需要一个(第一个)参数为自己,并且应该只转发其余的。
例如:
var calledFunction = function(num){
//do something with num
//remove num from the arguments
forwardFunction(arguments);
}
我已经尝试arguments.shift();
但是参数只是一个“类似于数组的对象”,因此不知道shift()
函数。
如何从参数中删除第一个参数并转发其余一系列参数?
答案 0 :(得分:5)
在ES6中,写这个的惯用方法是
var calledFunction = function(num, ...args) {
//do something with num
forwardFunction(...args);
}
答案 1 :(得分:3)
如果您想使用其他功能,可以使用.slice()
:
forwardFunction([].slice.call(arguments, 1));
现在,它将数组传递给" forwardFunction"。如果你想将除第一个之外的所有参数作为不同的单独参数传递,那么你必须使用.apply()
:
forwardFunction.apply(undefined, [].slice.call(arguments, 1));
对于需要在调用另一个函数时使用其参数的频繁使用的函数,小心使用简单的循环将参数复制到数组中会更好:
var a = [];
for (var i = 1; i < arguments.length; ++i)
a[i] = arguments[i];
forwardFunction(a); // or forwardFunction.apply(null, a);
(注意该循环跳过第一个参数。)如果arguments
对象作为参数传递给另一个函数,则通常无法优化调用函数。有时这不是什么大不了的事,但知道它的时间是很重要的。
另见sdgluck答案中的解构分配方法。我不知道这是否会导致优化问题;我对此表示怀疑,但后来我不确定ES2015代码在世界优化运行时系统中的成熟程度。
答案 2 :(得分:1)
ES5:
forwardFunction(Array.prototype.slice.call(arguments, 1));
ES6:
forwardFunction([...arguments].slice(1));