[javascript] CoffeeScript 好咖啡,不喝嗎

Javascript 不知道怎麼著突然紅了起來。所以有位神人就寫了一個東西,叫做 CoffeeScript,顧名思義,他是一種 script,然後可以讓你配著咖啡寫。或者是說,大概一杯咖啡的時間,可以寫好一些令人覺得繁雜的 Javascript。

是,他不是新的東西,他只是把 Javascript 重新包裝,換一個方式來作。

為什麼要這麼做?

首要目的,無非是省時間,第二就是,你可以少考慮一些事情,除非你比原作者還要熟悉 javascript 這件事情。其實市面上關於咖啡的文章太多了,我在這邊寫有點畫蛇添足。所以,我並不會介紹這是什麼,我只單就這個工具來說一些小小經驗談。

首先,他是一個跟 RailsRuby 或是 python 寫法或是部份用法相當類似的語言。所以,如果你是對於這兩者語言相當熟悉的人,對於 CoffeeScript 要上手應該也不是難事。當然,我對那兩個語言並不熟悉,所以要上手確實有點難度。

那,為什麼不直接寫 Javascript 就好?

大概是因為寫新的東西感覺比較潮,而且可以炫耀吧(喂

差別在哪裡?

這是一個簡單的 CoffeeScript,

a = [1,2,3,4]
for i in [0..(a.length-1)]
  alert(a[i])

翻譯成 javascript 之後會變成這樣,

(function() {
  var a, i, _ref;

  a = [1, 2, 3, 4];

  for (i = 0, _ref = a.length - 1; 0 <= _ref ? i <= _ref : i >= _ref; 0 <= _ref ? i++ : i--) {
    alert(a[i]);
  }

}).call(this);

你應該會問這什麼鬼啊!是,我當初從 javascript 轉換成 coffeescript 同樣也會有這個疑問。到底為什麼要這樣做呢?我們先來看看原來我想做什麼,

var a = [1,2,3,4];

for (var i = 0; i<a.length; i++) {
    alert(a[i]);
}

還原來看原本的目的很單純,但是為什麼有個 _ref 他到底要作什麼呢?假設,我們故意的把 a 清空,那麼會有什麼結果?

是的,迴圈還是會被執行,而且會跳出兩次 undefined 的 alert!

其實我並不清楚到底為什麼要這樣做?可能是為了確保迴圈會被執行,不過因為這樣而跳出訊息感覺就是很奇怪。

易讀還是不易讀?

有了上述的例子,你覺得他是屬於易讀還是不易讀?其實,就某方面來說,他確實是易讀的,只要你不要回頭去讀編譯出來的 js 檔案就好。這樣很彆拗嗎?請看,

if my_name is "John"
  alert("John")

這樣的 code 看起來是不是簡單易懂?編譯起來就是,

if (my_name === "John") alert("John");

所以,就某方面來說,其實他還蠻容易理解的。所謂不容易理解的地方,大概就像是這個樣子吧,底下是官方的一個例子,

solipsism = true if mind? and not world?

編譯起來大概是這樣,

var solipsism;

if ((typeof mind !== "undefined" && mind !== null) && !(typeof world !== "undefined" && world !== null)) {
    solipsism = true;
}

編譯結果其實與我們預期的差不多。所以,對於 CoffeeScript 的這種描述方法,必須得習慣,才可能好讀。

拜神

當然是首推龍哥,當然,官網一定要看 http://coffeescript.org/

結語

多寫就對了!

Hina Chen
偏執與強迫症的患者,算不上是無可救藥,只是我已經遇上我的良醫了。
Taipei