arguments は、関数へ渡された引数を配列の要素のように扱えるオブジェクトです。

構文

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 の定義
ドラフト  

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOS 版 SafariSamsung InternetNode.js
基本対応Chrome 完全対応 ありEdge 完全対応 ありFirefox 完全対応 1IE 完全対応 ありOpera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり
calleeChrome 完全対応 ありEdge 完全対応 ありFirefox 完全対応 1IE 完全対応 6Opera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり
caller
非推奨非標準
Chrome 未対応 なしEdge 未対応 なしFirefox 未対応 なしIE 未対応 ? — 9Opera 未対応 なしSafari 未対応 なしWebView Android 未対応 なしChrome Android 未対応 なしEdge Mobile 未対応 なしFirefox Android 未対応 なしOpera Android 未対応 なしSafari iOS 未対応 なしSamsung Internet Android 未対応 なしnodejs 未対応 なし
lengthChrome 完全対応 ありEdge 完全対応 ありFirefox 完全対応 1IE 完全対応 ありOpera 完全対応 ありSafari 完全対応 ありWebView Android 完全対応 ありChrome Android 完全対応 ありEdge Mobile 完全対応 ありFirefox Android 完全対応 4Opera Android 完全対応 ありSafari iOS 完全対応 ありSamsung Internet Android 完全対応 ありnodejs 完全対応 あり
@@iteratorChrome 完全対応 52Edge ? Firefox 完全対応 46IE 未対応 なしOpera 完全対応 ありSafari 完全対応 9WebView Android 完全対応 52Chrome Android 完全対応 52Edge Mobile ? Firefox Android 完全対応 46Opera Android 完全対応 ありSafari iOS 完全対応 9Samsung Internet Android 完全対応 6.0nodejs 完全対応 あり

凡例

完全対応  
完全対応
未対応  
未対応
実装状況不明  
実装状況不明
非標準。ブラウザー間の互換性が低い可能性があります。
非標準。ブラウザー間の互換性が低い可能性があります。
非推奨。新しいウェブサイトでは使用しないでください。
非推奨。新しいウェブサイトでは使用しないでください。

関連情報

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

最終更新者: uint256_t,