arguments
は、関数へ渡された引数に対応する Array
のようなオブジェクトです。
The source for this interactive example is stored in a GitHub repository. If you'd like to contribute to the interactive examples project, please clone https://github.com/mdn/interactive-examples and send us a pull request.
構文
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 Parameters、Default Parameters、および Destructured Parameters と組み合わせて使用できます。
function foo(...args) { return arguments; } foo(1, 2, 3); // { "0": 1, "1": 2, "2": 3 }
Rest Parameters、Default Parameters、Destructured Parameters があることによって strict mode のコードにおける arguments
オブジェクトの動作 が変わることはありませんが、strict ではないコードでは微妙な違いがあります。
Rest Parameters、Default Parameters、Destructured 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 Parameters、Default Parameters、Destructured 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 の定義 |
ドラフト |
ブラウザー実装状況
機能 | Chrome | Edge | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|---|
基本対応 | あり | あり | 1 | あり | あり | あり |
callee | あり | あり | 1 | 6 | あり | あり |
caller | なし | なし | なし | あり — 9 | なし | なし |
length | あり | あり | 1 | あり | あり | あり |
@@iterator | 52 | ? | 46 | なし | あり | 9 |
機能 | Android webview | Chrome for Android | Edge mobile | Firefox for Android | Opera Android | iOS Safari | Samsung Internet |
---|---|---|---|---|---|---|---|
基本対応 | あり | あり | あり | 4 | あり | あり | あり |
callee | あり | あり | あり | 4 | あり | あり | あり |
caller | なし | なし | なし | なし | なし | なし | なし |
length | あり | あり | あり | 4 | あり | あり | あり |
@@iterator | 52 | 52 | ? | 46 | あり | 9 | 6.0 |