一尘不染

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

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,能够接受并发送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发送待处理数组 作为 参数数组?


阅读 244

收藏
2020-04-25

共1个答案

一尘不染

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

func(...arr);

由于ES6还希望将参数视为数组,因此还可以在参数列表中使用传播语法,例如:

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;

但是无论如何,您可以传递任意数量的参数…

apply与不需要this在函数调用中设置值的情况相比,spread语法更短,更“甜” ,这就是方法。

这是一个应用示例,它是以前的实现方法:

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);

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

还要注意,该arguments对象并不是真正的数组,可以通过以下方式将其转换:

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

在ES6中:

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

但是arguments由于传播语法的原因,如今您很少直接使用该对象。

2020-04-25