CoffeeScript是一套JavaScript的轉(zhuǎn)譯語言,創(chuàng)建者 Jeremy Ashkenas 戲稱它是- JavaScript 的不那么鋪張的小兄弟。因為 CoffeeScript 會將類似 Ruby 語法的代碼編譯成 JavaScript,而且大部分結(jié)構(gòu)都相似,但不同的是 CoffeeScript 擁有更嚴(yán)格的語法。
歷史:
2009 年 12 月 24 日, CoffeeScript 版本 0.0.1 被提交.
2010 年 12 月 24 日, CoffeeScript 發(fā)布 1.0.0 穩(wěn)定版.
功能:
語法:從 Lisp 系重生CoffeeScript打蛇打到七寸了. 它的最大功績, 就是將 JavaScript 硬綁的 C/Java 語法拋棄了; 改為采用類似 Ruby/Python 的語法. Ruby/Python 本來就是深受 Lisp 影響的, 和 JavaScript 算是同門師兄, 他們的語法經(jīng)過了實踐考驗, 是更適合函數(shù)式+動態(tài)語言內(nèi)核的.
Good Parts:CoffeeScript 只使用了 JavaScript 的 ”Good Parts(精粹)”, 拋棄了原來 JavaScript 晦澀的,容易出問題的那部分東西. 比如,全局變量聲明, with 等.
語法糖和 ECMAScript:CoffeeScript 提供了很多語法糖, 讓代碼更優(yōu)雅可讀. 去主頁仔細(xì)看看 CoffeeScript 的語法清單, 就會發(fā)現(xiàn)邊邊角角到處是創(chuàng)新. 這讓編程語言真的成了開發(fā)者的朋友, 而不是機(jī)器的朋友.
CoffeeScript 還提供了一個機(jī)會, 讓你現(xiàn)在就可以使用 ECMAScript 里面的特性. 將來有個更多新特性, CoffeeScript 也有機(jī)會在瀏覽器支持之前實現(xiàn)它們. 程序員面對的是 CoffeeScript 的優(yōu)雅接口, 它是程序員和JavaScript 之間的中間層, 臟活累活它都干了.
發(fā)展:
CoffeeScript 構(gòu)建在 JavaScript 上層, 這讓人聯(lián)想起 .Net 和 C#/F#/VB… , 以及 JVM 和 Java/JRuby/Scala…
在 JavaScript 上層做事情的, 不只 CoffeeScript, 還有很多其他的. 比如 Lua 就有通過 LLVM 轉(zhuǎn)換成JavaScript 的實現(xiàn). 前段時間的 JavaScript PC 模擬器也證明了這種思路的威力.
也許 JavaScript 就是下一個 JVM, 上面會有最適用于各種場景的各種語言. 很多人盼望 JavaScript 成為為未來的唯一語言, 看起來這是不切實際的幻想了.
為什么要用CoffeeScript?
更少,更緊湊,和更清晰的代碼
通過規(guī)避和改變對JavaScript中不良部分的使用,只留下精華,讓代碼減少出錯率,更容易維護(hù)
在很多常用模式的實現(xiàn)上采用了JavaScript中的最佳實踐
CoffeeScript生成的JavaScript代碼都可以完全通過JSLint的檢測
什么情況下不推薦使用CoffeeScript?
CoffeeScript不是JavaScript的超集,也不是完全替代品,不應(yīng)該在不會JavaScript的情況下使用CoffeeScript工作
CoffeeScript是一種需要預(yù)編譯的語言,不能在運(yùn)行時(Runtime)解釋,這造成了她普遍被人質(zhì)疑的一點,就是如果代碼中出現(xiàn)運(yùn)行時錯誤時難以調(diào)試,不過從實際使用上來看,因為CoffeeScript的編譯結(jié)果大部分情況下自然而合理,我們沒有發(fā)現(xiàn)從生成的JavaScript代碼回溯到對應(yīng)的CoffeeScript代碼有什么困難之處。
這種靜態(tài)編譯還有一個額外的好處,就是CoffeeScript和現(xiàn)有的環(huán)境(瀏覽器,Node,Rhino等)與庫完全兼容
最簡單的安裝和測試CoffeeScript的方法,是使用*node.js*的*npm*安裝,然后使用命令行腳本實時編譯
npm install -g coffee-script
# watch and compile
coffee -w --output lib --compile src
這里假設(shè)你的coffee代碼在src目錄下,這個daemon會自動檢測文件的改變,并編譯成js文件放到lib目錄下
代碼展示編輯
官方網(wǎng)站展示的代碼
#賦值:
number=42
opposite=true
#條件:
number=-42 if opposite
#函數(shù):
square=(x)->x*x
#數(shù)組:
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?
#數(shù)組推導(dǎo)(comprehensions):
cubes=(math.cube num for num in list)
更多建議: