605

JavaScript の関数に「無制限」の変数を許可する方法はありますか?

例:

load(var1, var2, var3, var4, var5, etc...)
load(var1)
4

12 に答える 12

893

もちろん、argumentsオブジェクトを使用してください。

function foo() {
  for (var i = 0; i < arguments.length; i++) {
    console.log(arguments[i]);
  }
}
于 2010-01-26T18:08:04.823 に答える
283

(ほとんどの) 最近のブラウザーでは、次の構文で可変数の引数を受け入れることができます。

function my_log(...args) {
     // args is an Array
     console.log(args);
     // You can pass this array as parameters to another function
     console.log(...args);
}

以下に小さな例を示します。

function foo(x, ...args) {
  console.log(x, args, ...args, arguments);
}

foo('a', 'b', 'c', z='d')

=>

a
Array(3) [ "b", "c", "d" ]
b c d
Arguments
​    0: "a"
    ​1: "b"
    ​2: "c"
    ​3: "d"
    ​length: 4

ドキュメントとその他の例: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters

于 2016-08-20T04:46:27.027 に答える
120

もう 1 つのオプションは、コンテキスト オブジェクトで引数を渡すことです。

function load(context)
{
    // do whatever with context.name, context.address, etc
}

そして、このように使用します

load({name:'Ken',address:'secret',unused:true})

これには、必要な数の名前付き引数を追加できるという利点があり、関数はそれらを必要に応じて使用する (または使用しない) ことができます。

于 2010-01-26T18:34:14.343 に答える
49

ケンの答えが最もダイナミックであることに同意し、さらに一歩進めたいと思います。異なる引数で複数回呼び出す関数の場合 - Ken の設計を使用しますが、デフォルト値を追加します。

function load(context) {

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

    var context = extend(defaults, context);

    // do stuff
}

このように、多くのパラメーターがあり、関数を呼び出すたびにそれらを設定する必要がない場合は、単純に非デフォルトを指定できます。拡張メソッドについては、jQuery の拡張メソッド ( $.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];
}

これにより、コンテキスト オブジェクトがデフォルトとマージされ、オブジェクト内の未定義の値がデフォルトで埋められます。

于 2012-07-23T14:11:39.717 に答える
20

はい、このように:

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

load(1,2);
于 2010-01-26T18:08:12.857 に答える
10

名前付き引数のアプローチが有用で柔軟であることには概ね同意しますが (順序を気にしない限り、その場合は引数が最も簡単です)、mbeasley アプローチ (デフォルトと拡張を使用) のコストについては懸念があります。これは、デフォルト値を取得するための非常に大きなコストです。まず、デフォルトは関数内で定義されるため、呼び出しごとに再設定されます。次に、|| を使用して、名前付きの値を簡単に読み取り、同時にデフォルトを設定できます。この情報を取得するために、さらに別の新しいオブジェクトを作成してマージする必要はありません。

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

   // do stuff
}

これはほぼ同じ量のコードです (多少多いかもしれません) が、ランタイム コストの一部である必要があります。

于 2013-02-07T21:59:37.570 に答える
7

関数内でオブジェクトを使用して、arguments渡されたすべての引数にアクセスします。

于 2010-01-26T18:08:08.083 に答える
6

ケンが提案したように名前付きプロパティを持つオブジェクトを渡すと、すべての呼び出しに一時オブジェクトを割り当てて解放するコストが追加されることに注意してください。通常、通常の引数を値または参照で渡すのが最も効率的です。多くのアプリケーションではパフォーマンスは重要ではありませんが、一部のアプリケーションでは重要になる場合があります。

于 2014-08-06T20:25:50.417 に答える