是否有可能发送一个可变数量的参数到JavaScript函数?

是否有可能从一个数组发送可变数量的参数到JavaScript函数?

var arr = ['a','b','c'] var func = function() { // debug alert(arguments.length); // for(arg in arguments) alert(arg); } func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d' func(arr); // prints 1, then 'Array' 

我最近写了很多Python,能够接受可变参数并发送它们是一个非常好的模式。 例如

 def func(*args): print len(args) for i in args: print i func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d' func(*arr) // prints 4 which is what I want, then 'a','b','c','d' 

是否有可能在JavaScript发送一个数组被视为参数数组?

使用适用 :

 var arr = ['a','b','c']; var func = function() { alert(arguments.length); for(var i = 0; i < arguments.length; i++) { alert(arguments[i]); } }; func.apply(null, arr); 

注意, null用作apply的第一个参数,它将this关键字设置为func的Global对象(窗口)。

另外请注意, arguments对象并不是一个真正的数组,你可以通过以下方式进行转换:

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

也许对你有用,你可以知道函数期望有多less个参数:

 var test = function (one, two, three) {}; test.length == 3; 

但无论如何,你可以传递任意数量的参数。

实际上,您可以将任意数量的值传递给任何JavaScript函数。 明确命名的参数将获得前几个值,但所有参数将存储在参数数组中。

要以“unpacked”的forms传递arguments数组,你可以使用apply,像这样(cf Functional Javascript ):

 var otherFunc = function() { alert(arguments.length); // Outputs: 10 } var myFunc = function() { alert(arguments.length); // Outputs: 10 otherFunc.apply(this, arguments); } myFunc(1,2,3,4,5,6,7,8,9,10); 

图示和传播运算符是ES6的一部分,计划的下一个版本的Javascript。 到目前为止,只有Firefox支持它们。 此代码在FF16 +中工作:

 var arr = ['quick', 'brown', 'lazy']; var sprintf = function(str, ...args) { for (arg of args) { str = str.replace(/%s/, arg); } return str; } sprintf.apply(null, ['The %s %s fox jumps over the %s dog.', ...arr]); sprintf('The %s %s fox jumps over the %s dog.', 'slow', 'red', 'sleeping'); 

请注意传播的awkard语法。 sprintf('The %s %s fox jumps over the %s dog.', ...arr);的常用语法sprintf('The %s %s fox jumps over the %s dog.', ...arr); 尚不支持 。 你可以在这里find一个ES6兼容性表 。

还要注意另一个ES6的使用。 用于数组是一个坏主意 。

apply函数有两个参数。 将绑定到的对象,以及用数组表示的参数。

 some_func = function (a, b) { return b } some_func.apply(obj, ["arguments", "are", "here"]) // "are" 

这就是所谓的splat运营商。 你可以在JavaScript中使用apply

 var arr = ['a','b','c','d']; var func = function() { // debug console.log(arguments.length); console.log(arguments); } func('a','b','c','d'); // prints 4 which is what I want, then 'a','b','c','d' func(arr); // prints 1, then 'Array' func.apply(null, arr); 

这是一个计算可变参数和整数数组的整数和的示例程序。 希望这可以帮助。

 var CalculateSum = function(){ calculateSumService.apply( null, arguments ); } var calculateSumService = function(){ var sum = 0; if( arguments.length === 1){ var args = arguments[0]; for(var i = 0;i<args.length; i++){ sum += args[i]; } }else{ for(var i = 0;i<arguments.length; i++){ sum += arguments[i]; } } alert(sum); } //Sample method call // CalculateSum(10,20,30); // CalculateSum([10,20,30,40,50]); // CalculateSum(10,20); 
 (function(window) { var proxied = window.alert; window.alert = function() { return proxied.apply(window, arguments); }; }(this)); alert(13, 37); 

对于那些从一个函数传递可变数量的参数到另一个函数 (这不应该被标记为这个问题的重复)的redirect:

如果你试图从一个函数向另一个函数传递可变数量的参数,由于JavaScript 1.8.5,你可以简单地在第二个函数上调用apply()并传入arguments参数:

 var caller = function() { callee.apply( null, arguments ); } var callee = function() { alert( arguments.length ); } caller( "Hello", "World!", 88 ); // Shows "3". 

注意:第一个参数是要使用的this参数。 传递null将从全局上下文中调用函数,即作为全局函数而不是某个对象的方法。

根据这个文档 ,ECMAScript 5规范重新定义了apply()方法来取代任何“通用类数组对象”,而不是严格的数组。 因此,你可以直接将arguments列表传递给第二个函数。

在Chrome 28.0,Safari 6.0.5和IE 10中进行testing 。使用此JSFiddle进行testing 。

ES2015有两种方法。

arguments Object

这个对象被构build到函数中,它适当地引用了一个函数的参数。 不过在技术上这不是一个数组,所以典型的数组操作将不起作用。 build议的方法是使用Array.from或spread运算符从中创build一个数组。

我已经看到其他答案提到使用slice 。 不要这样做。 它阻止了优化(来源: MDN )。

 Array.from(arguments) [...arguments] 

然而,我认为arguments是有问题的,因为它隐藏了一个函数接受的input。 一个arguments函数通常是这样写的:

 function mean(){ let args = [...arguments]; return args.reduce((a,b)=>a+b) / args.length; } 

有时,函数头像下面这样写成,以类似C的方式logging参数:

 function mean(/* ... */){ ... } 

但是这很less见。

至于为什么它是有问题的,以C为例。 C向后兼容一种古代的称为K&R C的ANSI之前的方言。K&R C允许函数原型有一个空的参数列表。

 int myFunction(); /* This function accepts unspecified parameters */ 

ANSI C为varargs... )提供了一个工具,并且void指定了一个空的参数列表。

 int myFunction(void); /* This function accepts no parameters */ 

许多人不经意地使用unspecified参数列表( int myfunction(); )声明函数,当他们期望函数采用零参数时。 这在技术上是一个错误,因为函数接受参数。 任何数量的他们。

C中适当的varargs函数的forms如下:

 int myFunction(int nargs, ...); 

而JavaScript实际上也有类似的东西。

传播运营商 / rest参数

实际上,我已经向你展示了扩散算子。

 ...name 

这是相当通用的,也可以在函数的参数列表(“rest参数”)中使用以良好的logging方式指定可变参数:

 function mean(...args){ return args.reduce((a,b)=>a+b) / args.length; } 

或者作为lambdaexpression式:

 ((...args)=>args.reduce((a,b)=>a+b) / args.length)(1,2,3,4,5); // 3 

我更喜欢传播运营商。 这是干净的,自我logging。

是的,你可以通过variables号。 参数的函数。 你可以使用apply来实现这一点。

例如:

 var arr = ["Hi","How","are","you"]; function applyTest(){ var arg = arguments.length; console.log(arg); } testarr.apply(null,arr);