arguments
は、関数へ渡された引数を含む、関数内のみアクセス可能な 配列
様 (Array
-like) オブジェクトです。
注: “Array-like” とは、 length
プロパティ と 0 から始まる添字のプロパティを持ちますが、 forEach
や map
のような Array
の組み込みメソッドを持たない、ということです。詳しくは §Description を見てください。
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
オブジェクトはすべての(アローではない)関数内で利用可能なローカル変数です。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
を使用する
arguments
に typeof 演算子を使うと '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 の定義 |
ドラフト |
ブラウザー実装状況
デスクトップ | モバイル | サーバー | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
arguments | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 3 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
callee | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 6 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
caller | Chrome 未対応 なし | Edge 未対応 なし | Firefox 未対応 なし | IE 未対応 3 — 9 | Opera 未対応 なし | Safari 未対応 なし | WebView Android 未対応 なし | Chrome Android 未対応 なし | Firefox Android 未対応 なし | Opera Android 未対応 なし | Safari iOS 未対応 なし | Samsung Internet Android 未対応 なし | nodejs 未対応 なし |
length | Chrome 完全対応 1 | Edge 完全対応 12 | Firefox 完全対応 1 | IE 完全対応 4 | Opera 完全対応 あり | Safari 完全対応 あり | WebView Android 完全対応 1 | Chrome Android 完全対応 18 | Firefox Android 完全対応 4 | Opera Android 完全対応 あり | Safari iOS 完全対応 あり | Samsung Internet Android 完全対応 1.0 | nodejs 完全対応 あり |
@@iterator | Chrome 完全対応 52 | Edge 完全対応 12 | Firefox 完全対応 46 | IE 未対応 なし | Opera 完全対応 あり | Safari 完全対応 9 | WebView Android 完全対応 52 | Chrome Android 完全対応 52 | Firefox Android 完全対応 46 | Opera Android 完全対応 あり | Safari iOS 完全対応 9 | Samsung Internet Android 完全対応 6.0 | nodejs 完全対応 あり |
凡例
- 完全対応
- 完全対応
- 未対応
- 未対応
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 非標準。ブラウザー間の互換性が低い可能性があります。
- 非推奨。新しいウェブサイトでは使用しないでください。
- 非推奨。新しいウェブサイトでは使用しないでください。