[javascript] Q. 関数で可変長引数をつかうには?

A.
JavaScriptの関数の引数は幾つでも渡すことができます。
関数に定義されている引数と呼び出す際に渡す引数の数が異なっても
エラーは発生せず実行されます。

定義されている仮引数が2つの関数に引数を4つで呼び出してみます。
// 関数を作成
function totalprice(price, unit){
  return price * unit * 1.05;
}
// 関数を使う
var sum = totalprice(1000, 5, 200, 1000);
console.log(sum); // 5250
引数の数が異なっていてもエラーは発生しません。
渡された引数の最初の2個だけ利用されます。

関数の仮引数で指定していない残り2つの値の取得はできないのでしょうか?
関数の内部では "arguments" というオブジェクトが自動的に生成されます。
argumentsには関数の呼び出し時に渡された引数が格納されています。

argumentsの中身を確認してみましょう
// 関数を作成
function totalprice(price, unit){
  console.log(arguments);
  return price * unit * 1.05;
}
// 関数を使う
var sum = totalprice(1000, 5, 200, 1000);
argumentsオブジェクトの中身
js_arguments_1.png
arguments.lengthで引数に渡された数が確認できます。
引数の数が想定外の場合この値を利用し例外処理を行うなどが考えられます。

関数で定義した仮引数より呼び出しの引数が少ない場合の仮引数の値を確認してみます。

関数の仮引数が呼び出しの引数の数より大きい場合
// 関数を作成
function totalprice(price, unit){
  console.log(unit); // undefined
  return price * unit * 1.05;
}
// 関数を使う
var sum = totalprice(1000);
js_arguments_2.png
undefined になる事が確認できました。
undefinedになる事を利用して以下のようにデフォルト値を設定する事ができます。
// 関数を作成
function totalprice(price, unit){
  if(price == undefined) { price = 120 };
  unit = unit || 5;
  return price * unit * 1.05;
}
// 関数を使う
var sum = totalprice();
console.log(sum); // 630