ES2015の時点で2つの方法があります。
このオブジェクトは関数に組み込まれており、関数の引数を適切に参照します。ただし、技術的には配列ではないため、通常の配列操作は機能しません。推奨される方法は、Array.from
またはspread演算子を使用して、そこから配列を作成することです。
を使用して言及している他の回答を見てきましたslice
。そうしないでください。最適化を防ぎます(出典:MDN)。
Array.from(arguments)
[...arguments]
arguments
ただし、関数が入力として受け入れるものを隠すため、問題があると私は主張します。arguments
関数は通常、次のように記述されます。
function mean(){
let args = [...arguments];
return args.reduce((a,b)=>a+b) / args.length;
}
関数ヘッダーは、引数をCのように文書化するために、次のように記述される場合があります。
function mean(/* ... */){ ... }
しかし、それはまれです。
問題がある理由については、Cを例にとってみましょう。Cは、K&R Cとして知られる言語の古代のANSI以前の方言と下位互換性があります。K&R Cを使用すると、関数プロトタイプに空の引数リストを含めることができます。
int myFunction();
/* This function accepts unspecified parameters */
ANSI Cは、varargs
(...
)、およびvoid
空の引数リストを指定するための機能を提供します。
int myFunction(void);
/* This function accepts no parameters */
多くの人は、関数がゼロの引数を取ることを期待しているときに、unspecified
引数リスト( )を使用して関数を誤って宣言します。関数は引数を受け入れるint myfunction();
ため、これは技術的にはバグです。それらの任意の数。
Cの適切なvarargs
関数は、次の形式を取ります。
int myFunction(int nargs, ...);
そしてJavaScriptは実際にはこれに似たものを持っています。
実際、スプレッド演算子についてはすでに説明しました。
...name
これは非常に用途が広く、関数の引数リスト(「RESTパラメーター」)で使用して、適切に文書化された方法でvarargsを指定することもできます。
function mean(...args){
return args.reduce((a,b)=>a+b) / args.length;
}
またはラムダ式として:
((...args)=>args.reduce((a,b)=>a+b) / args.length)(1,2,3,4,5); // 3
私はスプレッド演算子の方がずっと好きです。クリーンで自己文書化されています。