arguments は、関数へ渡された引数を含む、関数内のみアクセス可能な 配列様 (Array-like) オブジェクトです。

注: “Array-like” とは、 length プロパティ と 0 から始まる添字のプロパティを持ちますが、 forEach や map のような Array の組み込みメソッドを持たない、ということです。詳しくは §Description を見てください。

構文

arguments

説明

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

たとえば、もし関数に 3 つの引数が渡されたなら、次のようにその引数を参照できます。

arguments[0] // 1 番めの引数
arguments[1] // 2 番めの引数
arguments[2] // 3 番めの引数

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

arguments[1] = 'new value';

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

var args = Array.prototype.slice.call(arguments);
// Using an array literal is shorter than above but allocates an empty array
var args = [].slice.call(arguments); 

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

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

arguments に限らず、配列様オブジェクトは ES2015 の Array.from() メソッドやスプレッド構文によって、本当の配列に変換することができます。

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

arguments オブジェクトは、あらかじめ定義された引数の数よりも多くの引数で呼び出される関数に便利です。このテクニックは Math.min() などの 可変数の引数を受け入れる関数に便利です。この例の関数は、任意の数の文字列が引数で、引数の中で一番長い文字列を返します。

function longestString() {
  var longest = '';
  for (var i=0; i < arguments.length; i++) {
    if (arguments[i].length > longest.length) {
      longest = arguments[i];
    }
  }
  return longest;
}

関数に渡された引数の数を測るために arguments.length が使え、それから arguments オブジェクトを使って各引数を処理できます。関数のシグネチャでの引数の数を測るためには、Function.length プロパティを使ってください。

arguments と typeof を使用する

argumentstypeof 演算子を使うと 'object' が返ります。

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

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

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

プロパティ

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

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

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

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、デフォルト、分割 引数

arguments オブジェクトを Restデフォルト分割 引数と組み合わせて使用できます。

function foo(...args) {
  return args;
}
foo(1, 2, 3); // [1,2,3]

Restデフォルト分割 引数によって strict mode のコードにおける arguments オブジェクトの動作 が変わることはありませんが、strict ではないコードでは微妙な違いがあります。

Restデフォルト分割 引数を含まない 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デフォルト分割 引数を含む 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 完全対応 あり

凡例

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

関連情報

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

最終更新者: mdnwebdocs-bot,