トップページのサンプルを見てみました

rubyみたいな記法で短く書けるっぽいです

書くのは楽そうですが読むのが辛そうです

ところで、サンプルのCoffeeScriptで書いたのをJavaScript化した例をみていると、「こんな複雑なのが簡単にかけるんだー」とか思えますがよくみてみると無駄に長くしてる部分が多いです
自動で変換してるんだからしょうがないですし、多少長くても普通はそれを読むわけじゃないので問題はないんですけど
これをみてるとJavaScriptで同じくらい短くしてみたくなったのでやってみました
http://coffeescript.org/

これが元のコードです
左がcoffee script、右が左コードをJavaScriptに変換したものです

# Assignment: number = 42 opposite = true # Conditions: number = -42 if opposite # Functions: square = (x) -> x * x # Arrays: list = [1, 2, 3, 4, 5] # Objects: math = root: Math.sqrt square: square cube: (x) -> x * square x # Splats: race = (winner, runners...) -> print winner, runners # Existence: alert "I knew it!" if elvis? # Array comprehensions: cubes = (math.cube num for num in list)
var cubes, list, math, num, number, opposite, race, square, __slice = [].slice; number = 42; opposite = true; if (opposite) { number = -42; } square = function(x) { return x * x; }; list = [1, 2, 3, 4, 5]; math = { root: Math.sqrt, square: square, cube: function(x) { return x * square(x); } }; race = function() { var runners, winner; winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : []; return print(winner, runners); }; if (typeof elvis !== "undefined" && elvis !== null) { alert("I knew it!"); } cubes = (function() { var _i, _len, _results; _results = []; for (_i = 0, _len = list.length; _i < _len; _i++) { num = list[_i]; _results.push(math.cube(num)); } return _results; })();


複雑ですね…

で、こっちが短いJavaScript版
左側は上と同じで右側が変わってます

# Assignment: number = 42 opposite = true # Conditions: number = -42 if opposite # Functions: square = (x) -> x * x # Arrays: list = [1, 2, 3, 4, 5] # Objects: math = root: Math.sqrt square: square cube: (x) -> x * square x # Splats: race = (winner, runners...) -> print winner, runners # Existence: alert "I knew it!" if elvis? # Array comprehensions: cubes = (math.cube num for num in list)
// Assignment: number = 42; opposite = true;
// Conditions: opposite && (number = -42); // Functions: square = x => x * x; // Arrays: list = [1, 2, 3, 4, 5]; // Objects: math = { root: Math.sqrt, square: square, cube: x => x * square(x) };
// Splats: race = (winner, ...runners) => print(winner, runners); // Existence: window.elvis && alert("I knew it!"); // Array comprehensions: cubes = list.map(num => math.cube(num));



=>で無名関数定義や...で可変長引数はECMAScript6の機能で対応してるのはFirefoxだけです
Firefoxで実行してみると動きます

こうしてみてみるとJavaScriptで書いてもそんなに大差ないですね
そうなると変換しないとダメで、直接コンソールに打って実行できないCoffeeScriptよりはJavaScriptでいいかなと思ってしまいます

他のJavaScriptに変換できる言語調べてみるとTypeScriptというのがありました
こっちは、マイクロソフトが作った言語でクラスベースで型ありです

Javaとかの言語使ってた人には向いてそうですが、JavaScriptの動的型付けやプロトタイプベースのオブジェクト指向が好きな人からすると劣化してるだけなのではと思います

JavaScriptで型ありクラスベースというと同じECMAScriptのActionScriptが思い浮かびます
このあたりは特に使ったこと無いので詳しい違いはわかってないです