省略可能な引数を持つ関数を定義する場合は、省略された引数に適切なデフォルト値が設定されるようにする。この時パラメータの数が多い場合では、最後のパラメータのみを指定したい場合など、省略するパラメータ全てに「null」のプレースホルダーを使う必要が生じる。
//第1パラメータのみが必須の関数 function show_params(req1, opt1, opt2, opt3, opt4, opt5) { opt1 = opt1 || ' default1'; opt2 = opt2 || ' default2'; opt3 = opt3 || ' default3'; opt4 = opt4 || ' default4'; opt5 = opt5 || ' default5'; if(!req1) { throw new Error("第1引数は必須です"); } alert( req1 + opt1 + opt2 + opt3 + opt4 + opt5 ); } show_params('required', null, null, null, null, ' ##Not default##');
このような場合、オプションのパラメータをオブジェクトで指定するとわかりやすく、またプレースホルダーも不要になる。
function show_params(req1, option) { opt1 = option.opt1 || ' default1'; opt2 = option.opt2 || ' default2'; opt3 = option.opt3 || ' default3'; opt4 = option.opt4 || ' default4'; opt5 = option.opt5 || ' default5'; if(!req1) { throw new Error("第1引数は必須です"); } alert( req1 + opt1 + opt2 + opt3 + opt4 + opt5 ); } show_params('required', {opt5: ' ##Not default##'});
jQuery では更に、$.extend を利用することでもっとすっきりとすることが可能。
my_options パラメータで渡した値と、デフォルトの値のオブジェクトをマージすることで、settings 変数は、デフォルト値の中の呼び出し側で指定した値だけを書き換えたものになる。(パラメータの順序も気にする必要はない)
function show_params(req1, my_options) { var settings = $.extend({ opt1 : ' default1', opt2 : ' default2', opt3 : ' default3', opt4 : ' default4', opt5 : ' default5' }, my_options || {}); if(!req1) { throw new Error("第1引数は必須です"); } alert( req1 + settings.opt1 + settings.opt2 + settings.opt3 + settings.opt4 + settings.opt5 ); } show_params('required', {opt5: ' ##Not default##', opt2: ' @@Not Default@@' });
「required default1 @@Not Default@@ default3 default4 ##Not default##」と表示される。
「 my_options || {} 」により、false と評価される(null や undefined の)オプションには、空のオブジェクトが設定される。
パラメータは次のとおり。
var target = {a:10, b:20, c:30}; var source1 = {c:40, d:50, e:60}; var source2 = {e:70, f:80, g:90}; $.extend(target, source1, source2); //targetは {a:10, b:20, c:40, d:50, e:70, f:80, g:90} c と e の値は上書きされている。