虽然我是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;})();