argumentsオブジェクトを使って関数に渡された値を取得する

広告

関数へ渡された値は引数に順番に格納されますが、 arguments オブジェクトを使うことで呼び出し側から渡されてきた値の数や実際の値を取得することができます。ここでは arguments オブジェクトを使って関数に渡された値を取得する方法について解説します。

argumentsオブジェクトとは

arguments オブジェクトは関数の中でのみ利用できるオブジェクトです。関数に渡されてきた値をすべて格納しており、配列の要素のように arguments[0], arguments[1], .... という形で関数に渡されてきた値を取得することができます。なお arguments オブジェクトはアロー関数の中では使用できないのでご注意ください。

関数にいくつの値が実際に渡されてきたのかは、 arguments オブジェクトの length プロパティを参照することで確認することができます。

関数で受け取る値の数が決まっていない場合などに arguments オブジェクトを使用することで順番に取り出すことができますが、現在は可変長引数の機能が利用できるようになりましたので arguments オブジェクトを使用しなくても数が決まっていない値を受け取ることができます。(詳しくは「可変長引数を記述する」を参照されてください)。

それでは arguments オブジェクトの使い方について順番に見ていきます。

実際に渡された引数の数を取得する(length)

JavaScript では関数側で引数を例えば 2 つ受け取るように定義されていたとしても、関数を呼びだす時に関数に渡す値は 2 つよりも多くても少なくてもエラーとはなりません。

function dispProfile(name, old){
  console.log('name : ' + name);
  console.log('old : ' + old);
}

dispProfile('Yamada', 24, 'Tokyo');
>> name : Yamada
>> old : 24

dispProfile('Suzuki');
>> name : Suzuki
>> old : undefined

渡されてきた値が多かった場合は単に使われず、少なかった場合に値が格納されなかった引数は undefined となります。

このように JavaScript では関数が呼び出された時に、必ずしも関数側で定義した引数の数だけ値が渡されてくるとは限りません。このような場合に arguments オブジェクトの length プロパティを参照すると、実際に渡されてきた値を取得することができます。書式は次のようになります。

arguments.length

arguments オブジェクトは関数の中でしか使用できないので、 length プロパティも関数内でのみ参照できます。

次のサンプルをみてください。

function dispProfile(name, old){
  console.log('arguments.length : ' + arguments.length);
}

dispProfile('Yamada', 24, 'Tokyo');
>> arguments.length : 3

dispProfile('Suzuki');
>> arguments.length : 1

今回のサンプルでは関数 dispTotal が呼び出されると、 arguments オブジェクトの length プロパティの値を参照して、呼び出し元からいくつの値が実際に関数に渡されてきたのかをコンソールに出力しています。

呼び出し元から渡されてきた値を取得する

呼び出し元から渡されてきた値は関数の引数に記述した変数に格納されますが、それとは別に arguments オブジェクトにも格納されており、それぞれ arguments[0]、 arguments[1]、 ... という形取得することができます。

次のサンプルをみてください。

function dispProfile(){
  console.log('name : ' + arguments[0]);
  console.log('old : ' + arguments[1]);
}

dispProfile('Yamada', 24);
>> name : Yamada
>> old : 24

今回のサンプルでは関数の定義で引数は何も記述していませんが、関数を呼びだし元から渡されてきた値を arguments オブジェクトを使って取得しコンソールに出力しています。

また arguments オブジェクトを使うことで引数の数が決まっていない場合でも順に渡されてきた値を取得して処理することができます。次のサンプルをみてください。

function dispTotal(){
  let sum = 0;
  for (let i = 0; i < arguments.length; i++){
    sum += arguments[i];
  }

  console.log('sum = ' + sum);
}

dispTotal(1, 3, 5);
>> sum = 9

dispTotal(7, 12, 3, 2, 8);
>> sum = 32

今回のサンプルでは aruguments.length プロパティを使って呼び出し元から渡されてきた値の数を取得し、値の数だけ順に加算した結果をコンソールに出力していますので、関数を呼びだす時の値の数がいくつであっても大丈夫です。

argumentsオブジェクトを使用する場合の注意点

ここまで関数は function キーワードを使った関数宣言によるもので試してきましたが、関数リテラルを使って関数を定義した場合であっても同じように使うことができます。

let dispTotal = function(){
  let sum = 0;
  for (let i = 0; i < arguments.length; i++){
    sum += arguments[i];
  }

  console.log('sum = ' + sum);
};

dispTotal(1, 3, 5);
>> sum = 9

また Function コンストラクタを使って関数を定義した場合でも同じように使うことができます。

ただアロー関数式を使って関数を定義した場合には、 arguments オブジェクトを使用することができず arguments is not defined というエラーが発生しますのでご注意ください。

let dispTotal = () => {
  let sum = 0;
  for (let i = 0; i < arguments.length; i++){
    sum += arguments[i];
  }

  console.log('sum = ' + sum);
};

dispTotal(1, 3, 5);
>> Uncaught ReferenceError: arguments is not defined

-- --

arguments オブジェクトを使って関数に渡された値を取得する方法について解説しました。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。