CoffeeScript概览

2018-08-23 12:03 更新

CoffeeScript是一套JavaScript的转译语言,创建者 Jeremy Ashkenas 戏称它是- JavaScript 的不那么铺张的小兄弟。因为 CoffeeScript 会将类似 Ruby 语法的代码编译成 JavaScript,而且大部分结构都相似,但不同的是 CoffeeScript 拥有更严格的语法。


历史:
2009 年 12 月 24 日, CoffeeScript 版本 0.0.1 被提交.
2010 年 12 月 24 日, CoffeeScript 发布 1.0.0 稳定版.


功能:
语法:从 Lisp 系重生CoffeeScript打蛇打到七寸了. 它的最大功绩, 就是将 JavaScript 硬绑的 C/Java 语法抛弃了; 改为采用类似 Ruby/Python 的语法. Ruby/Python 本来就是深受 Lisp 影响的, 和 JavaScript 算是同门师兄, 他们的语法经过了实践考验, 是更适合函数式+动态语言内核的.

Good Parts:CoffeeScript 只使用了 JavaScript 的 ”Good Parts(精粹)”, 抛弃了原来 JavaScript 晦涩的,容易出问题的那部分东西. 比如,全局变量声明, with 等.
语法糖和 ECMAScript:CoffeeScript 提供了很多语法糖, 让代码更优雅可读. 去主页仔细看看 CoffeeScript 的语法清单, 就会发现边边角角到处是创新. 这让编程语言真的成了开发者的朋友, 而不是机器的朋友.

CoffeeScript 还提供了一个机会, 让你现在就可以使用 ECMAScript 里面的特性. 将来有个更多新特性, CoffeeScript 也有机会在浏览器支持之前实现它们. 程序员面对的是 CoffeeScript 的优雅接口, 它是程序员和JavaScript 之间的中间层, 脏活累活它都干了.


发展:
CoffeeScript 构建在 JavaScript 上层, 这让人联想起 .Net 和 C#/F#/VB… , 以及 JVM 和 Java/JRuby/Scala…

在 JavaScript 上层做事情的, 不只 CoffeeScript, 还有很多其他的. 比如 Lua 就有通过 LLVM 转换成JavaScript 的实现. 前段时间的 JavaScript PC 模拟器也证明了这种思路的威力.

也许 JavaScript 就是下一个 JVM, 上面会有最适用于各种场景的各种语言. 很多人盼望 JavaScript 成为为未来的唯一语言, 看起来这是不切实际的幻想了.



为什么要用CoffeeScript?

更少,更紧凑,和更清晰的代码
通过规避和改变对JavaScript中不良部分的使用,只留下精华,让代码减少出错率,更容易维护
在很多常用模式的实现上采用了JavaScript中的最佳实践
CoffeeScript生成的JavaScript代码都可以完全通过JSLint的检测
什么情况下不推荐使用CoffeeScript?


CoffeeScript不是JavaScript的超集,也不是完全替代品,不应该在不会JavaScript的情况下使用CoffeeScript工作
CoffeeScript是一种需要预编译的语言,不能在运行时(Runtime)解释,这造成了她普遍被人质疑的一点,就是如果代码中出现运行时错误时难以调试,不过从实际使用上来看,因为CoffeeScript的编译结果大部分情况下自然而合理,我们没有发现从生成的JavaScript代码回溯到对应的CoffeeScript代码有什么困难之处。

这种静态编译还有一个额外的好处,就是CoffeeScript和现有的环境(浏览器,Node,Rhino等)与库完全兼容


最简单的安装和测试CoffeeScript的方法,是使用*node.js*的*npm*安装,然后使用命令行脚本实时编译


npm install -g coffee-script
# watch and compile
coffee -w --output lib --compile src


这里假设你的coffee代码在src目录下,这个daemon会自动检测文件的改变,并编译成js文件放到lib目录下


代码展示编辑
官方网站展示的代码

#赋值:
number=42
opposite=true
 
#条件:
number=-42 if opposite
 
#函数:
square=(x)->x*x
 
#数组:
list=[1,2,3,4,5]
 
#对象:
math=
root:Math.sqrt
square:square
cube:(x)->x*squarex
 
#Splats:
race=(winner,runners...)->
print winner,runners
 
#存在性:
alert"I knew it!" if elvis?
 
#数组推导(comprehensions):
cubes=(math.cube num for num in list)

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号