CoffeeScriptは、代表的なAltJS(JavaScriptの代用品)です。AltJSとしては、ほかにはTypeScriptが有名です。
Railsでは、標準でCoffeeScriptが使えるようになっているので、積極的に使うようにすると生産性があがるかも知れません。
CoffeeScriptの文法は、RubyやPythonに似ています。ブロック構造で制御構造を表すところは、PythonやHamlに似ています。
ES6(次世代JavaScript)の登場でAltJSの方向性が不透明になったり、GoogleがTypeScriptを正式採用したりといろいろ話題に事欠かないですが、小規模なアプリ開発でJavaScriptを多用する場合は選択肢の一つとして持っておいて損はないです。
JavaScriptとの大きな違い
行末のセミコロン;
および関数呼び出し時の引数のカッコ()
が不要(つけてもよい)
alert('Hello, world!');
alert 'Hello, world!'
ブロック構造はインデントで表現するので、波カッコ{}
が不要
if (a == true) {
alert('a is true!');
} else {
alert('a is false!');
}
if a == true
alert 'a is true!'
else
alert 'a is false!'
===
演算子はもう必要ありません
if (a === null) {
alert('a is null!');
}
if a == null
alert 'a is null!'
関数定義はアロー演算子(->
,=>
)を用いる
function f(x) {
return true;
}
f = (x) ->
true
アロー演算子を用いると、JQueryで多用されがちなコールバックが簡潔に書ける
JavaScript
$(document).ready(function() {
$('#button').click(function() {
alert('Button is pushed!');
)};
});
$(document).ready ->
$('#button').click ->
alert 'Button is pushed!'
ほかの違い
クラスが定義できたり、ブロック構造全体の戻り値を利用できたり、return
文が必要なかったり、ただのテンプレートエンジンと割り切るにはあまりにも多くの機能を持っています(もはや異なる言語)。特に、JavaScriptでは煩雑になりがちなArray.eachの処理やHash.eachの処理を簡潔に書ける点はそれだけとってもJavaScriptから乗り換える価値があると思います。
欠点
ブラウザがCoffeeScriptを実行するのではなく、Railsの場合アセットパイプラインでプリコンパイルされたJavaScriptが実行されます。そのため、デバッグがしづらいという欠点があります(ソースコードの行数と生成されたJavaScriptの行数が異なるため)
ChromeやFirefoxでは、アドオンを利用することによりCoffeeScriptのデバッグにも対応可能なようです。
欠点ではありませんがグローバルスコープは原則使えません。
変数名の前に@をつけると擬似的にグローバルスコープ(当該Windowにバインドされたローカル変数)が使用できます。
また、ローカルスコープから変数の値が外に漏れることもありません。(クロージャが自動的に生成されます)
みんな大好き三項演算子が使えません!if
-then
構文を用いて書き直します(if
-then
ブロックが最後に評価した値を返す性質を用います)。
a = (a === null) ? 'null' : a + ' hello';
a = if a == null then 'null' else a + ' hello'
複数行でもOK!
a = if a == null then
'null'
else
a + ' hello'
その他のメリット
JavaScirptの代替品なので、Rails以外でも使えます。たとえば、node.jsではCoffeeScriptを用いて記述することが一般的に行われています。
この場合、Gulp.jsなどを用いてコンパイルします。サーバサイドがnode.jsの場合、サーバサイドの記述にもCoffeeScriptを用いることができるわけです。