JavaScript可变参数个数

有没有办法允许JavaScript中的函数使用“无限”的var?

例:

load(var1, var2, var3, var4, var5, etc...)
load(var1)
小宇宙JinJinHarry2020/03/12 16:36:31

请注意,按照Ken的建议传递带有命名属性的Object会增加分配和释放临时对象到每个调用的成本。通过值或引用传递普通参数通常是最有效的。对于许多应用程序而言,性能并不关键,但对于某些应用程序则可能至关重要。

小卤蛋村村2020/03/12 16:36:31

尽管我通常都同意命名实参方法是有用且灵活的(除非您关心顺序,在这种情况下实参最简单),但我确实对mbeasley方法的成本(使用默认值和扩展)感到担忧。拉取默认值要花费极高的成本。首先,默认值是在函数内部定义的,因此每次调用都会重新填充它们。其次,您可以轻松地读出命名值并使用||同时设置默认值。无需创建和合并另一个新对象即可获取此信息。

function load(context) {
   var parameter1 = context.parameter1 || defaultValue1,
       parameter2 = context.parameter2 || defaultValue2;

   // do stuff
}

这大约是相同数量的代码(可能略多),但是应该只是运行时成本的一小部分。

神无LEYMandy2020/03/12 16:36:31

arguments在函数内部使用该对象可以访问传入的所有参数。

凯梅小胖2020/03/12 16:36:31

是的,就像这样:

function load()
{
  var var0 = arguments[0];
  var var1 = arguments[1];
}

load(1,2);
逆天老丝2020/03/12 16:36:31

我同意Ken的回答是最有活力的,并且我想更进一步。如果您使用不同的参数多次调用该函数-我使用Ken的设计,然后添加默认值:

function load(context) {

    var defaults = {
        parameter1: defaultValue1,
        parameter2: defaultValue2,
        ...
    };

    var context = extend(defaults, context);

    // do stuff
}

这样,如果您有许多参数,但不必每次调用该函数都进行设置,则只需指定非默认值即可。对于extend方法,您可以使用jQuery的extend方法($.extend()),自己编写或使用以下方法:

function extend() {
    for (var i = 1; i < arguments.length; i++)
        for (var key in arguments[i])
            if (arguments[i].hasOwnProperty(key))
                arguments[0][key] = arguments[i][key];
    return arguments[0];
}

这会将上下文对象与默认值合并,并使用默认值填充对象中所有未定义的值。

Jim老丝猪猪2020/03/12 16:36:31

如Ramast所指出的,最好使用rest参数语法。

function (a, b, ...args) {}

我只想添加... args参数的一些不错的属性

  1. 它是一个数组,而不是类似参数的对象。这使您可以应用地图或直接排序等功能。
  2. 它不包括所有参数,而仅包括从其传递过来的参数。例如,函数(a,b,... args)在这种情况下args包含arguments.length的参数3
猴子古一蛋蛋2020/03/12 16:36:31

当然,只需使用arguments对象即可。

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