是否可以向 JavaScript 函数发送可变数量的参数?

2022-08-30 01:34:01

是否可以从数组向 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 中,是否可以发送一个要被视为参数数组的数组?


答案 1

更新:从 ES6 开始,您可以在调用函数时简单地使用 spread 语法

func(...arr);

由于 ES6 还如果您希望将参数视为数组,则还可以在参数列表中使用 spread 语法,例如:

function func(...args) {
  args.forEach(arg => console.log(arg))
}

const values = ['a', 'b', 'c']
func(...values)
func(1, 2, 3)

您可以将其与普通参数组合,例如,如果您想分别接收前两个参数,并将其余参数作为数组接收:

function func(first, second, ...theRest) {
  //...
}

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

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

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

跨页语法比“更甜”更短,更“甜”,如果您不需要在函数调用中设置值,这就是要走的路。applythis

下面是一个应用示例,这是前者的方法:

var arr = ['a','b','c'];

function func() {
  console.log(this); // 'test'
  console.log(arguments.length); // 3

  for(var i = 0; i < arguments.length; i++) {
    console.log(arguments[i]);
  }

};

func.apply('test', arr);

如今,我只建议仅在需要从数组传递任意数量的参数设置值时才使用。 take是将值作为第一个参数,它将用于函数调用,如果我们在非严格代码中使用,关键字将引用内部的Global对象(窗口),在严格模式下,当显式使用“use strict”或在ES模块中时,将被使用。applythisapplythisnullthisfuncnull

另请注意,参数对象并不是真正的数组,您可以通过以下方式对其进行转换:

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

在 ES6 中:

const argsArray = [...arguments] // or Array.from(arguments)

但是由于传播语法,您现在很少直接使用该对象。arguments


答案 2

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

要以“解包”形式传递参数数组,可以使用 apply,如下所示 (c.f. 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);