文档章节

看到CoffeeScript,我潸然泪下

路过暴风
 路过暴风
发布于 2014/01/15 07:34
字数 647
阅读 179
收藏 1

虽然我是C语言的忠实fans,连带从心底热爱C语法,虽然我超讨厌Ruby,连带讨厌一切和Ruby沾边的,但CoffeeScript那优雅的语法还是把我征服了,左边那诗一样优美的代码,右边那一坨,额,怎么说呢,屎一样的感觉:

(最好去官网看对比,在博客上看并不是很不明显,官网在此


后记:刚一接触CoffeeScript确实有很强的冲击力,主要是和JavaScript的对比过于强烈,但在简单的翻了翻CoffeeScript的入门书之后,感觉这种基本采用Ruby式的语法也并不是非常完美,这个问题见仁见智吧,我说说自己觉得不够好的地方:

1.

对匿名函数的处理确实是一大亮点,但CoffeeScript对于小括号的厌恶是不是有点过分了呢?比如函数调用的一种方式竟然是函数名+空格+参数,结果造成了如下情景:

foo = 'Red'

bar = foo +5 #此为注释,正确形式(注意空格)应为 bar = foo + 5

结果出错,加号后面的空格不能忽略,因为foo +5被CoffeeScript解释为foo(+5)

其实函数后面的括弧我真的不讨厌,甚至我觉得这是一个很清晰的标记,能够让我在一堆表达式里一眼看出哪个是函数,为什么要采用空格来调用函数的方式呢?(事实上,CoffeeScript也接受括弧调用的方式,而且估计应该是更加常用),除了制造混乱之外,这种方式的好处并不明显


2.

字符串插值是很实用的,但

foo = 'red'

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;
})();

© 著作权归作者所有

共有 人打赏支持
路过暴风
粉丝 10
博文 34
码字总数 26455
作品 0
牡丹江
私信 提问
加载中

评论(2)

路过暴风
路过暴风

引用来自“newjunwei”的评论

js 看着也还可以把,不算一坨

去http://coffeescript.org/官网上看下,对比很强烈,当然coffeescript官网故意挑了一些对比强烈的代码。。。。。。
newjunwei
newjunwei
js 看着也还可以把,不算一坨
初探 CoffeeScript

上周末我去参加了Java开发者大会讨论了几个非常有意思的话题。有名演讲者谈到了Underscore,当时他使用的演示都是基于CoffeeScript完成的。我以前与CoffeeScript这玩意有过一面之缘,但经过他...

junwong
2012/04/18
4.1K
15
初探 CoffeeScript

上周末我去参加了 Java开发者大会讨论了几个非常有意思的话题。有名演讲者谈到了 Underscore,当时他使用的演示都是基于 CoffeeScript完成的。我以前与CoffeeScript这玩意有过一面之缘,但经...

彭博
2012/11/27
177
1
[翻译]当jQuery遭遇CoffeeScript的时候——妙,不可言

原作:How CoffeeScript makes jQuery more fun than ever—— Stefan Buhrmester 翻译:filod 转载声明:请注明原作者、翻译者以及译文链接。 译者前言:虽然对ruby不太了解,但是看到Coffe...

quanpower
2013/05/27
0
11
CoffeeScript 2.2.2 发布,编译成 JS 的小巧语言

CoffeeScript 2.2.2 已发布,CoffeeScript 2 最大的变化是,CoffeeScript 编译器会生成现代 JavaScript 语法( ES6 或 ES2015 及以上版本)。一个 CoffeeScript =>会变成一个 JS => ,一个 ...

局长
02/23
675
1
CoffeeScript 2.0.0 正式发布,编译成 JS 的小巧语言

在经过 5 个测试版后,CoffeeScript 2.0.0 正式发布了。 从 CoffeeScript 1.x 到 2 的变化不多,大部分项目都能顺利升级。CoffeeScript 2 最大的变化是,CoffeeScript 编译器会生成现代 Java...

王练
2017/09/19
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

Netty handle方法周期 (四)

写了一个练习之后,发现自定义的助手类每次肯定是必须的,对于不同的业务逻辑需求,会写相对应的逻辑 最简单的查看Handle生命周期的方式,就是重写上级方法,看名字差不多应该可以知道方法的作用 ...

_大侠__
12分钟前
2
0
vue主动刷新页面及列表数据删除后的刷新实例

1.场景 在处理列表时,常常有删除一条数据或者新增数据之后需要重新刷新当前页面的需求。 2.遇到的问题 1. 用vue-router重新路由到当前页面,页面是不进行刷新的 2.采用window.reload(),或者...

前端小攻略
23分钟前
5
0
闲话高并发的那些神话,看京东架构师如何把它拉下神坛

高并发也算是这几年的热门词汇了,尤其在互联网圈,开口不聊个高并发问题,都不好意思出门。高并发有那么邪乎吗?动不动就千万并发、亿级流量,听上去的确挺吓人。但仔细想想,这么大的并发与...

James-
28分钟前
4
0
Emacs 系列:让我们拥抱 Emacs 和 org 模式

导读 我必须承认,在使用了几十年的 vim 后, 我被 Emacs 吸引了。长期以来,我一直对如何组织安排事情感到沮丧。我也有用过 GTD 和 ZTD 之类的方法,但是像邮件或是大型文件这样的事务真的很...

问题终结者
29分钟前
5
0
解析Node.js通过axios实现网络请求

本次给大家分享一篇node.js通过axios实现网络请求的方法,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 1、使用Npm 下载axios n...

前端攻城老湿
42分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部