是否有可能发送一个可变数量的参数到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);