ECMAScriptargumentsオブジェクト

argumentsオブジェクト

関数コードでは、特殊オブジェクト argumentsを使用して、開発者パラメータ名を明示する必要はありませんそれで、それらにアクセスできます。

例えば、関数 sayHi() では、最初のパラメータは message です。arguments[0] でもこの値にアクセスできます、つまり最初のパラメータの値です(最初のパラメータは位置 0、次のパラメータは位置 1、その後も同様です)。

したがって、パラメータ名を明示する必要はなく、関数を再定義できます:

function sayHi() {
  if (arguments[0] == "bye") {
    return;
  }
  alert(arguments[0]);
}

引数の数の検出

arguments オブジェクトを使用して、関数の引数の数を検出することもできます。arguments.length プロパティを使用します。

以下のコードは、関数が呼び出された際の引数の数を表示します:

function howManyArgs() {
  alert(arguments.length);
}
howManyArgs("string", 45);
howManyArgs();
howManyArgs(12);

上記のコードは「2」、「0」と「1」を順に表示します。

注記:他のプログラミング言語とは異なり、ECMAScript は関数に渡される引数の数が関数の定義に指定された引数の数に等しいかどうかを確認しません。開発者が定義した関数は、任意の数の引数を受け取ることができます(Netscape の文書によると、最大255個までです)が、エラーメッセージは発生しません。欠けている引数は undefined として渡され、余分な引数は無視されます。

関数のオーバーロードのシミュレート

arguments オブジェクトを使用して、関数に渡される引数の数を確認することで、関数のオーバーロードをシミュレートできます:

function doAdd() {
  if(arguments.length == 1) {
    alert(arguments[0] + 5);
  } else if(arguments.length == 2) {
    alert(arguments[0] + arguments[1]);
  }
}
doAdd(10);	//「15」と出力
doAdd(40, 20);	//「60」と出力

引数が1つだけの場合、doAdd() 関数は引数に5を加えます。引数が2つある場合、2つの引数を足し合わせ、その和を返します。したがって、doAdd(10) は「15」と出力し、doAdd(40, 20) は「60」と出力します。

オーバーロードよりも良いとは言えませんが、ECMAScript のこの制限を回避するには十分です。