このargumentsオブジェクトは、配列じゃないのでびみょーに使い勝手が悪かったりするんだよね。
そこで、coffeescriptを使ってあげると関数の引数名に「...」をつけてあげるだけで、いい感じに可変長引数を扱うことができます。
簡単な例を見てみましょう。
可変長引数を1つ受け取る関数
func = (params...) -> console.log params.join console.log params.join('-') func 1, 2, 3
上記プログラムの実行結果。パラメータのparamsにはjoin関数が定義されていて、引数で指定した複数の値が、連結されているのがわかります。
[Function: join] 1-2-3
可変長引数とそれ以外の引数を受け取る関数
func = (params..., param2) -> console.log params.length console.log params.join('-') console.log "param2 = [#{param2}]" func 1, 2, 3
上記プログラムを実行すると、最後に指定したパラメータが2番めの引数に、最後を除くパラメータが可変長引数に設定されていることがわかります。
2 1-2 param2 = [3]
コンパイルされたJavaScriptを見てみると
可変長引数を、配列のslice関数を使用して配列に変換しているようです。(function() { var func, __slice = [].slice; func = function() { var params; params = 1 <= arguments.length ? __slice.call(arguments, 0) : []; console.log(params.join); return console.log(params.join('-')); }; }).call(this);