arguments は、関数へ渡された引数に対応する Array のようなオブジェクトです。

構文

arguments

説明

arguments オブジェクトはすべての(non-arrow な)関数内で利用可能なローカル変数です。arguments オブジェクトを使うことにより、関数内で関数の引数を参照できます。このオブジェクトは、関数に渡された各引数に対する入力を含みます。最初の入力の添え字は 0 から始まります。たとえば、もし関数に 3 つの引数が渡されたなら、次のようにその引数を参照できます:

arguments[0]
arguments[1]
arguments[2]

引数を設定することもできます:

arguments[1] = 'new value';

arguments オブジェクトは Array ではありません。これは Array と似ていますが、length 以外のどんな Array のプロパティも持ちません。たとえば、これは pop メソッドを持ちません。しかしながら、これは本当の Array に変換できます:

var args = Array.prototype.slice.call(arguments);
var args = [].slice.call(arguments);

// ES2015
const args = Array.from(arguments);

arguments で slice を使用すると、一部の JavaScript エンジン (例えば V8、詳細) で最適化を妨げます。これに配慮するには、代わりに arguments オブジェクトでイテレートを行って新しい配列を作成します。代替策として、Array コンストラクターを関数として使用します:

var args = (arguments.length === 1 ? [arguments[0]] : Array.apply(null, arguments));

形式的に受け入れるよう宣言された引数の数よりも多くの引数を用いて関数を呼び出しても、arguments オブジェクトが使えます。この技法は、可変数の引数を渡されることのある関数に役立ちます。関数に渡された引数の数を測るために arguments.length が使え、それから arguments オブジェクトを使って各引数を処理できます。関数の シグネチャ での引数の数を測るためには、Function.length プロパティを使ってください。

arguments と typeof を使用する

typeof arguments は 'object' が返ります。

console.log(typeof arguments); // 'object' 

個々の引数の typeof は、添え字を使用して判断できます。

console.log(typeof arguments[0]); // 個々の引数の typeof を返す

arguments とスプレッド演算子を使用する

配列的なオブジェクトでできるように、arguments を本物の Array に変換するために、Array.from() メソッドや スプレッド演算子 も使用できます:

var args = Array.from(arguments);
var args = [...arguments];

プロパティ

arguments.callee
現在実行している関数を示す。
arguments.caller
現在実行している関数を呼び出した関数を示す。
arguments.length
関数に渡された引数の数を示す。
arguments[@@iterator]
引数内の各インデックスに対する値を収めた、新たな Array Iterator オブジェクトを返します。

複数の文字列を連結する関数を定義する

この例では、複数の文字列を連結する関数を定義します。この関数の唯一の仮引数は、連結する項目を区切る文字を指定する文字列です。この関数は次のように定義されます:

function myConcat(separator) {
  var args = Array.prototype.slice.call(arguments, 1);
  return args.join(separator);
}

この関数へ任意の数の引数を渡すことができ、各引数をリストの項目として使うリストを作れます。

// "red, orange, blue" を返す
myConcat(', ', 'red', 'orange', 'blue');

// "elephant; giraffe; lion; cheetah" を返す
myConcat('; ', 'elephant', 'giraffe', 'lion', 'cheetah');

// "sage. basil. oregano. pepper. parsley" を返す
myConcat('. ', 'sage', 'basil', 'oregano', 'pepper', 'parsley');

HTML リストを作る関数を定義する

この例では、リストのための HTML を含む文字列を作る関数を定義します。この関数の第 1 引数には、順不同リスト (中黒付き) なら "u"、順序リスト (番号付き) なら "o" を指定します。関数は次のように定義します。

function list(type) {
  var result = '<' + type + 'l><li>';
  var args = Array.prototype.slice.call(arguments, 1);
  result += args.join('</li><li>');
  result += '</li></' + type + 'l>'; // end list

  return result;
}

この関数には任意の数の引数を渡すことができ、指定されたリスト形式のリストに第 2 引数以降の各引数を項目として追加します。例えば:

var listHTML = list('u', 'One', 'Two', 'Three');

/* listHTML の内容は以下のような文字列となります。

"<ul><li>One</li><li>Two</li><li>Three</li></ul>"

*/

Rest、Default、Destructured パラメータ

arguments オブジェクトを Rest ParametersDefault Parameters、および Destructured Parameters と組み合わせて使用できます。

function foo(...args) {
  return arguments;
}
foo(1, 2, 3); // { "0": 1, "1": 2, "2": 3 }

Rest ParametersDefault ParametersDestructured Parameters があることによって strict mode のコードにおける arguments オブジェクトの動作 が変わることはありませんが、strict ではないコードでは微妙な違いがあります。

Rest ParametersDefault ParametersDestructured Parameters含まない strict ではない関数では、arguments オブジェクトの値が引数の値を追跡します (逆も同じです)。以下のコードをご覧ください:

function func(a) { 
  arguments[0] = 99; // arguments[0] を更新すると a も更新される
  console.log(a);
}
func(10); // 99

および

function func(a) { 
  a = 99; // a を更新すると arguments[0] も更新される
  console.log(arguments[0]);
}
func(10); // 99

Rest ParametersDefault ParametersDestructured Parameters含む strict ではない関数では、arguments オブジェクトの値が引数の値を追跡しません (逆も同じです)。代わりに、呼び出し時に与えられた引数を反映します:

function func(a = 55) { 
  arguments[0] = 99; // arguments[0] を更新しても a は更新されない
  console.log(a);
}
func(10); // 10

および

function func(a = 55) { 
  a = 99; // a を更新しても arguments[0] は更新されない
  console.log(arguments[0]);
}
func(10); // 10

および

function func(a = 55) { 
  console.log(arguments[0]);
}
func(); // undefined

仕様

仕様書 策定状況 コメント
ECMAScript 1st Edition (ECMA-262) 標準 最初の定義。JavaScript 1.1 で実装
ECMAScript 5.1 (ECMA-262)
Arguments Object の定義
標準  
ECMAScript 2015 (6th Edition, ECMA-262)
Arguments Exotic Objects の定義
標準  
ECMAScript Latest Draft (ECMA-262)
Arguments Exotic Objects の定義
ドラフト  

ブラウザー実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応 あり あり1 あり あり あり
callee あり あり16 あり あり
caller なし なし なし あり — 9 なし なし
length あり あり1 あり あり あり
@@iterator52 ?46 なし あり9
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応 あり あり あり4 あり あり あり
callee あり あり あり4 あり あり あり
caller なし なし なし なし なし なし なし
length あり あり あり4 あり あり あり
@@iterator5252 ?46 あり96.0

関連情報

ドキュメントのタグと貢献者

 このページの貢献者: Uemmra3, woodmix, mdmss37, yyss, teoli, ethertank, Potappo, Mgjbot, Nanto vi
 最終更新者: Uemmra3,