まくまくJavaScriptノート
デフォルト引数を扱う関数を定義する
2013-05-29

JavaScript でデフォルト引数を実現するには、実引数が渡されなかったときに、仮引数の値が undefined になることを利用します。

正しい書き方

これが基本

function myfunc(a, b, c) {
  if (typeof c === 'undefined') {
    c = 100;  // default value
  }
}

上記のように、typeof でパラメータの型を取得し、それが undefined という文字列と一致するのを確認するのが一番安全な方法です。

お勧めできない書き方

下記のように直接パラメータを undefined と比較する方法の方がシンプルに記述できますが、undefined の値は書き換えられる可能性があるため完璧ではありません。

シンプルだが完璧ではない方法

function myfunc(a, b, c) {
  if (c === undefined) {
    c = 100;  // default value
  }
}

実引数として偽値 (0, false, null, undefied, NaN, '') が渡された場合に、デフォルト値で値を置き換えるという手法もあります。 実引数を渡さなかった場合はそのパラメータの値は undefined になるので、これを利用してデフォルト引数を実現しようという考えですが、この方法では値を渡していても「偽」と判断される値だった場合にデフォルト値に置換されてしまうので、お勧めできる書き方ではありません。

偽の値を渡した時に値を置き換える方法(危険)

function myfunc(a, b, c) {
  c = c || 100;
}

完全に間違った書き方

JavaScript では、C++ や Python のように、仮引数の宣言部でデフォルト引数を定義することはできません

間違った方法(構文エラー)

function myfunc(a, b, c=100) {  // NG!
  ...
}

上記のような書き方をすると、環境によって動作したり、エラーになって動かなくなったりします。

2013-05-29