arguments は、関数へ渡された引数に対応する Array のようなオブジェクトです。
構文
arguments
説明
arguments はすべての関数内で利用可能なローカル変数です。arguments オブジェクトを使うことにより、関数内で関数の引数を参照できます。このオブジェクトは、関数に渡された各引数に対する入力を含みます。最初の入力の添え字は 0 から始まります。たとえば、もし関数に 3 つの引数が渡されたなら、次のようにその引数を参照できます:
arguments[0] arguments[1] arguments[2]
引数を設定することもできます:
arguments[1] = 'new value';
arguments オブジェクトは Array ではありません。これは Array と似ていますが、length 以外のどんな Array のプロパティも持ちません。たとえば、これは pop メソッドを持ちません。しかしながら、これは本当の Array に変換できます:
var args = (arguments.length === 1?[arguments[0]]:Array.apply(null, arguments));
arguments オブジェクトは関数本体の中でのみ利用可能です。関数宣言の外部で arguments オブジェクトにアクセスを試みると、エラーを引き起こします。
形式的に受け入れるよう宣言されたのよりも多くの引数を用いて関数を呼び出しても、arguments オブジェクトが使えます。この技法は、可変数の引数を渡されることのある関数に役立ちます。関数に渡された引数の数を測るために arguments.length が使え、それから arguments オブジェクトを使って各引数を処理できます。関数のシグネチャでの引数の数を測るためには、Function.length プロパティを使ってください。
プロパティ
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 を含む文字列を作る関数を定義します。この関数の第一引数には、順不同リスト (中黒付き) なら "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;
}
この関数には任意の数を渡すことができ、指定されたリスト形式のリストに第二引数以降の各引数を項目として追加します。
var listHTML = list("u", "One", "Two", "Three");
/* listHTML の内容は以下の様な文字列となります。
"<ul><li>One</li><li>Two</li><li>Three</li></ul>"
*/
Rest、Default、Destructured パラメータ
arguments オブジェクトを Rest Parameters、Default Parameters、および Destructured Parameters と組み合わせて使用できます。
function foo(...args) {
return arguments;
}
foo(1, 2, 3); // { "0": 1, "1": 2, "2": 3 }
ただし、strict ではない関数では Rest Parameters、Default Parameters、Destructured Parameters を含まない場合に限り、マップされた arguments オブジェクトが提供されます。例えば以下の関数は Default Parameter を使用しており、100 ではなく10 が返ります:
function bar(a=1) {
arguments[0] = 100;
return a;
}
bar(10); // 10
関数内に Rest Parameters がある場合に arguments オブジェクトを変更すると、実際の引数の値が変わります。例えば:
function zoo(a) {
arguments[0] = 100;
return a;
}
zoo(10); // 100
仕様
| 仕様書 | 策定状況 | コメント |
|---|---|---|
| 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 2016 Draft (7th Edition, ECMA-262) Arguments Exotic Objects の定義 |
ドラフト |
ブラウザ実装状況
| 機能 | Chrome | Firefox (Gecko) | Internet Explorer | Opera | Safari |
|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | (有) | (有) | (有) |
| 機能 | Android | Chrome for Android | Firefox Mobile (Gecko) | IE Mobile | Opera Mobile | Safari Mobile |
|---|---|---|---|---|---|---|
| 基本サポート | (有) | (有) | (有) | (有) | (有) | (有) |