雖然我是C語言的忠實fans,連帶從心底熱愛C語法,雖然我超討厭Ruby,連帶討厭一切和Ruby沾邊的,但CoffeeScript那優雅的語法仍是把我征服了,左邊那詩同樣優美的代碼,右邊那一坨,額,怎麼說呢,屎同樣的感受:php
(最好去官網看對比,在博客上看並非很不明顯,官網在此)函數
後記:剛一接觸CoffeeScript確實有很強的衝擊力,主要是和JavaScript的對比過於強烈,但在簡單的翻了翻CoffeeScript的入門書以後,感受這種基本採用Ruby式的語法也並非很是完美,這個問題見仁見智吧,我說說本身以爲不夠好的地方:spa
對匿名函數的處理確實是一大亮點,但CoffeeScript對於小括號的厭惡是否是有點過度了呢?好比函數調用的一種方式居然是函數名+空格+參數,結果形成了以下情景:coffeescript
foo = 'Red'ip
bar = foo +5 #此爲註釋,正確形式(注意空格)應爲 bar = foo + 5
字符串
結果出錯,加號後面的空格不能忽略,由於foo +5被CoffeeScript解釋爲foo(+5)get
其實函數後面的括弧我真的不討厭,甚至我以爲這是一個很清晰的標記,可以讓我在一堆表達式裏一眼看出哪一個是函數,爲何要採用空格來調用函數的方式呢?(事實上,CoffeeScript也接受括弧調用的方式,並且估計應該是更加經常使用),除了製造混亂以外,這種方式的好處並不明顯博客
字符串插值是很實用的,但it
foo = 'red'io
bar = "color is #{foo}"
這裏面的#看着好刺眼,js和php的不少模板都使用,bar = "color is {{foo}}"這種方式我以爲比Ruby的這種順眼一些。
這是CoffeeScript的代碼:
# 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)
做爲對比,這是JavaScript的代碼:
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;})();