ES2015現在、2つの方法があります。
このオブジェクトは関数に組み込まれており、適切に関数の引数を参照します。ただし、技術的には配列ではないため、一般的な配列操作では機能しません。推奨される方法は、Array.from
またはスプレッド演算子を使用して、そこから配列を作成することです。
他の回答がを使用して言及するのを見ました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();
)を使用して関数を誤って宣言します。関数は引数を受け入れるため、これは技術的にバグです。それらの任意の数。
varargs
Cの適切な関数は次の形式を取ります。
int myFunction(int nargs, ...);
そして、JavaScriptは実際にこれに似たものを持っています。
実際、スプレッドオペレーターについてはすでに説明しました。
...name
これはかなり用途が広く、関数の引数リスト(「残りのパラメーター」)で使用して、適切に文書化された方法で可変引数を指定できます。
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
スプレッドオペレーターの方がずっと好きです。クリーンで自己文書化されています。
for - in
ループを使用するのは良い考えではないことに注意してください。代わりにarguments
、length
プロパティを反復する「通常」のforループを使用する必要があります