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