是否可以从数组中向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,这是一个很好的模式,能够接受varargs并发送它们 . 例如
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中发送一个数组来处理 as 参数数组?
12 回答
是的你可以传递变量号 . 函数的参数 . 您可以使用
apply
来实现此目的 .例如 . :
使用apply:
请注意,
null
用作apply的第一个参数,它将this
关键字设置为func
内的Global对象(窗口) .另请注意,arguments对象实际上不是一个数组,您可以通过以下方式将其转换为:
也许对您有用,您可以知道函数需要多少个参数:
但无论如何你可以传递任意数量的参数......
您实际上可以将任意数量的值传递给任何javascript函数 . 显式命名的参数将获得前几个值,但ALL参数将存储在arguments数组中 .
要在"unpacked"表单中传递arguments数组,可以使用apply,如下所示(c.f. Functional Javascript):
splat和spread运算符是ES6的一部分,ES6是计划的下一版Javascript . 到目前为止只有Firefox支持它们 . 此代码适用于FF16:
注意传播的awkard语法 .
sprintf('The %s %s fox jumps over the %s dog.', ...arr);
的通常语法是not yet supported . 你可以找到an ES6 compatibility table here .另请注意使用for...of,另外添加ES6 . 对数组使用
for...in
是a bad idea .ES2015有两种方法 .
参数Object
该对象内置于函数中,它适当地引用函数的参数 . 但是,从技术上讲,它不是一个数组,所以典型的数组操作不适用于它 . 建议的方法是使用
Array.from
或扩展运算符从中创建数组 .我见过使用
slice
提到的其他答案 . 不要那样做 . 它会阻止优化(来源:MDN) .但是,我认为
arguments
是有问题的,因为它隐藏了函数接受的输入 .arguments
函数通常是这样写的:有时,函数头像下面这样编写,以类似C的方式记录参数:
但这种情况很少见 .
至于为什么它有问题,以C为例 . C向后兼容一种称为K&R C的古老的ANSI前语言.K&R C允许函数原型具有空参数列表 .
ANSI C为
varargs
(...
)提供了工具,void
用于指定空参数列表 .许多人在希望函数采用零参数时无意中声明了具有
unspecified
参数列表(int myfunction();
)的函数 . 这在技术上是一个错误,因为该函数将接受参数 . 任意数量的 .C中适当的
varargs
函数采用以下形式:JavaScript实际上确实有类似的东西 .
传播操作员/休息参数
实际上,我已经向你展示了传播运营商 .
它非常通用,也可以在函数的参数列表(“休息参数”)中使用,以一种很好的文档方式指定varargs:
或者作为lambda表达式:
我更喜欢传播运营商 . 它干净,自我记录 .
apply
函数有两个参数;对象this
将绑定到,并且参数用数组表示 .它被称为
splat
运算符 . 您可以使用apply
在JavaScript中执行此操作:使用ES6,您可以将rest parameters用于
varagrs
. 这将获取参数列表并将其转换为数组 .这是一个示例程序,用于计算变量参数和整数数组的整数之和 . 希望这可以帮助 .
对于那些从Passing variable number of arguments from one function to another重定向的人(应将 not 标记为此问题的副本):
如果您尝试将可变数量的参数从一个函数传递到另一个函数,那么从JavaScript 1.8.5开始,您只需在第二个函数上调用
apply()
并传入arguments
参数:Note: 第一个参数是要使用的
this
参数 . 传递null
将从全局调用该函数上下文,即作为全局函数而不是某个对象的方法 .根据this document,ECMAScript 5规范重新定义了
apply()
方法以获取任何"generic array-like object",而不是严格的数组 . 因此,您可以直接将arguments
列表传递给第二个函数 .在Chrome 28.0,Safari 6.0.5和IE 10中测试过 . 使用this JSFiddle进行测试 .
您是否希望函数对数组参数或变量参数作出反应?如果是后者,请尝试:
但是如果你想处理一个数组参数