CoffeeScript 是一種編譯成 JavaScript 的小型語言。在笨拙的 Java 風格外表下,JavaScript 一直擁有華麗的心。CoffeeScript 嘗試以簡單的方式揭露 JavaScript 的優點。

CoffeeScript 的黃金法則為:「它只是 JavaScript。」程式碼會一對一編譯成等效的 JS,且執行時沒有解釋。您可以從 CoffeeScript 無縫使用任何現有的 JavaScript 函式庫(反之亦然)。編譯的輸出可讀、美化,而且執行速度往往與手寫的等效 JavaScript 一樣快,甚至更快。

最新版本: 2.7.0

# Install locally for a project:
npm install --save-dev coffeescript

# Install globally to execute .coffee files anywhere:
npm install --global coffeescript

概觀

CoffeeScript 在 上方左方,編譯後的 JavaScript 輸出在 下方右方。CoffeeScript 可編輯!

CoffeeScript 2

CoffeeScript 2 有什麼新功能?

CoffeeScript 2 最大的變更在於,現在 CoffeeScript 編譯器會產生現代 JavaScript 語法(ES6 或 ES2015 及更新版本)。CoffeeScript => 會變成 JS =>,CoffeeScript class 會變成 JS class,以此類推。CoffeeScript 2 的主要新功能包括 非同步函式JSX。您可以在 公告 中閱讀更多資訊。

從 CoffeeScript 1.x 升級到 2 的 重大變更 非常少;我們希望升級過程對大多數專案來說都很順利。

相容性

CoffeeScript 支援的大多數現代 JavaScript 功能都可以在 Node 7.6+ 中原生執行,這表示 Node 可以執行 CoffeeScript 的輸出,而不需要任何進一步的處理。以下是幾個值得注意的例外

此清單可能不完整,且不包含在旗標後方支援較新功能的 Node 版本;請參閱 node.green 以取得完整詳細資料。您可以 在瀏覽器中執行測試,以查看瀏覽器支援哪些功能。您有責任確保執行時期支援您使用的現代功能;或者 轉譯 您的程式碼。有疑問時,請轉譯。

如需與其他 JavaScript 架構和工具的相容性,請參閱 整合

安裝

coffee 的命令列版本可用作 Node.js 實用程式,需要 Node 6 或更新版本。然而,核心編譯器 不依賴於 Node,可以在任何 JavaScript 環境或瀏覽器中執行(請參閱 試試 CoffeeScript)。

要安裝,請先確認您有 Node.js 最新穩定版本的執行副本。然後,您可以使用 npm 全域安裝 CoffeeScript

npm install --global coffeescript

這將使 coffeecake 命令可以在全域使用。

如果您在專案中使用 CoffeeScript,您應該在該專案中安裝它,以便將 CoffeeScript 版本追蹤為專案的相依性之一。在該專案資料夾中

npm install --save-dev coffeescript

coffeecake 命令會先在目前資料夾中尋找 CoffeeScript 是否已安裝,如果已安裝,就會使用該版本。這允許在全域和本機安裝不同版本的 CoffeeScript。

如果您打算使用 --transpile 選項(請參閱 Transpilation),您需要在全域或本機安裝 @babel/core,具體取決於您執行的是 CoffeeScript 的全域或本機安裝版本。

用法

命令列

安裝後,您應該可以使用 coffee 命令,它可以執行指令碼、將 .coffee 檔案編譯成 .js,並提供互動式 REPL。coffee 命令採用下列選項

選項 說明
-c, --compile .coffee 指令碼編譯成同名的 .js JavaScript 檔案。
-t, --transpile 在儲存或執行產生的 JavaScript 之前,透過 Babel 傳遞 CoffeeScript 編譯器的輸出。需要安裝 @babel/core,以及在 .babelrc 檔案或 package.json 中傳遞給 Babel 的選項,其中包含要編譯的檔案或資料夾路徑中的 babel 鍵。請參閱 Transpilation
-m, --map 與編譯的 JavaScript 檔案一起產生原始碼對應。也會將 sourceMappingURL 指令新增到 JavaScript 中。
-M, --inline-map 就像 --map,但將原始碼對應直接包含在編譯的 JavaScript 檔案中,而不是在個別的檔案中。
-i, --interactive 啟動互動式 CoffeeScript 會話,以嘗試簡短的片段。與不帶引數呼叫 coffee 相同。
-o, --output [DIR] 將所有已編譯的 JavaScript 檔案寫入指定的目錄。與 --compile--watch 搭配使用。
-w, --watch 監控檔案變更,當任何檔案更新時重新執行指定的命令。
-p, --print 不將 JavaScript 寫入檔案,而是直接列印到 stdout
-s, --stdio 透過 STDIN 輸入 CoffeeScript,並透過 STDOUT 取得 JavaScript。適合與以其他語言編寫的程序搭配使用。範例
cat src/cake.coffee | coffee -sc
-l, --literate 將程式碼解析為 Literate CoffeeScript。只有在直接透過 stdio 傳遞程式碼,或使用某種無副檔名的檔案名稱時,才需要指定此選項。
-e, --eval 直接從命令列編譯並列印一段 CoffeeScript 程式碼片段。例如
coffee -e "console.log num for num in [10..1]"
-r, --require [MODULE] 在啟動 REPL 或評估使用 --eval 旗標提供的程式碼之前,require() 指定的模組。
-b, --bare 在沒有 頂層函式安全包裝器 的情況下編譯 JavaScript。
--no-header 隱藏「由 CoffeeScript 產生」的標頭。
--nodejs node 可執行檔有一些有用的選項可以設定,例如 --debug--debug-brk--max-stack-size--expose-gc。使用此旗標將選項直接轉發到 Node.js。若要傳遞多個旗標,請多次使用 --nodejs
--ast 產生 CoffeeScript 節點的抽象語法樹。用於與 JavaScript 建置工具整合。
--tokens 不解析 CoffeeScript,僅執行詞法分析,並列印出標記串流。用於除錯編譯器。
-n, --nodes 不編譯 CoffeeScript,僅執行詞法分析和解析,並列印出解析樹。用於除錯編譯器。

範例

  • src 中的 .coffee 檔案目錄樹編譯成 lib 中的 .js 檔案平行樹
    coffee --compile --output lib/ src/
  • 監看檔案變更,並在每次檔案儲存時重新編譯
    coffee --watch --compile experimental.coffee
  • 將檔案清單串接成單一指令碼
    coffee --join project.js --compile src/*.coffee
  • 列印出單行指令碼編譯的 JS
    coffee -bpe "alert i for i in [0..10]"
  • 全部一起,在您處理專案時監看並重新編譯整個專案
    coffee -o lib/ -cw src/
  • 啟動 CoffeeScript REPL(Ctrl-D 退出,Ctrl-V 多行)
    coffee

若要使用 --transpile,請參閱 轉譯

Node.js

如果您想使用 Node.js 的 CommonJS 來 require CoffeeScript 檔案,例如 require './app.coffee',您必須先將 CoffeeScript「註冊」為擴充功能

require 'coffeescript/register'

App = require './app' # The .coffee extension is optional

如果您想使用編譯器的 API,例如建立一個應用程式來動態編譯 CoffeeScript 字串,您可以 require 完整模組

CoffeeScript = require 'coffeescript'

eval CoffeeScript.compile 'console.log "Mmmmm, I could really go for some #{Math.pi}"'

compile 方法具有簽章 compile(code, options),其中 code 是 CoffeeScript 程式碼字串,而選用的 options 是具有下列部分或全部屬性的物件

  • options.sourceMap,布林值:如果為 true,將產生原始碼對應,而且 compile 會傳回 {js, v3SourceMap, sourceMap} 形式的物件,而不是傳回字串。
  • options.inlineMap,布林值:如果為 true,將在底部的註解中以 base64 編碼字串的形式輸出原始碼對應。
  • options.filename,字串:要使用的原始碼對應檔名。它可以包含路徑(相對或絕對)。
  • options.bare,布林值:如果為 true,則在沒有 頂層函式安全性包裝函式 的情況下輸出。
  • options.header,布林值:如果為 true,則輸出 Generated by CoffeeScript 標頭。
  • options.transpile物件:如果設定,這必須是一個物件,其中包含 傳遞給 Babel 的選項。請參閱 轉譯
  • options.ast,布林值:如果為 true,則傳回 CoffeeScript 原始碼的抽象語法樹。

轉譯

CoffeeScript 2 產生使用最新現代語法的 JavaScript。您的程式碼要執行的執行時間或瀏覽器 可能不支援所有這些語法。在這種情況下,我們希望將現代 JavaScript 轉換為較舊的 JavaScript,以便在舊版本的 Node 或舊瀏覽器中執行;例如,將 { a } = obj 轉換為 a = obj.a。這是透過轉譯器(例如 BabelBubléTraceur Compiler)來完成的。請參閱 建置工具

快速入門

從專案的根目錄

npm install --save-dev @babel/core @babel/preset-env
echo '{ "presets": ["@babel/env"] }' > .babelrc
coffee --compile --transpile --inline-map some-file.coffee

使用 CoffeeScript 編譯器進行轉譯

為了簡化作業,CoffeeScript 內建支援熱門的 Babel 轉譯器。您可以透過 --transpile 命令列選項或 transpile Node API 選項來使用它。要使用任一選項,您的專案中必須安裝 @babel/core

npm install --save-dev @babel/core

或者,如果您在專案資料夾外執行 coffee 指令,使用全域安裝的 coffeescript 模組,則需要全域安裝 @babel/core

npm install --global @babel/core

預設情況下,Babel 什麼都不做,它不會假設您要轉譯成什麼。您需要提供設定檔,讓它知道要執行什麼動作。執行此動作的方法之一是在您要編譯的檔案所在的資料夾中,或在這些檔案上方的任何父資料夾中,建立 .babelrc 檔案。(Babel 也支援 其他方式。)一個最小的 .babelrc 檔案將會是 { "presets": ["@babel/env"] }。這表示您已安裝 @babel/preset-env

npm install --save-dev @babel/preset-env  # Or --global for non-project-based usage

請參閱 Babel 網站以了解預設值和外掛程式 以及您擁有的眾多選項。如果您使用 React 搭配 JSX,另一個您可能需要的預設值是 @babel/plugin-transform-react-jsx(JSX 也可與其他架構搭配使用)。

安裝 @babel/core@babel/preset-env(或其他預設值或外掛程式)並放置 .babelrc 檔案(或其他等效檔案)後,您可以使用 coffee --transpile 將 CoffeeScript 的輸出透過 Babel 導引,並使用您已儲存的選項。

如果您透過 Node API 使用 CoffeeScript,其中您呼叫 CoffeeScript.compile 並提供要編譯的字串和 options 物件,則 options 物件的 transpile 鍵應該是 Babel 選項

CoffeeScript.compile(code, {transpile: {presets: ['@babel/env']}})

您也可以在不使用 transpile 選項的情況下編譯 CoffeeScript 的輸出,例如作為建置鏈的一部分。這讓您可以使用 Babel 以外的編譯器,而且讓您能更有效地控制處理程序。有許多很棒的任務執行器可供設定 JavaScript 建置鏈,例如 GulpWebpackGruntBroccoli

Polyfill

請注意,轉譯並不會自動提供 polyfill 給你的程式碼。如果你使用 in 運算子、解構或展開/剩餘語法,CoffeeScript 本身會輸出 Array.indexOf;如果你在類別中使用繫結 (=>) 方法,則會輸出 Function.bind。這兩個在 Internet Explorer 9 以上版本和所有更新的瀏覽器中都受支援,但如果你需要支援 Internet Explorer 8 或以下版本,而且使用會導致輸出這些方法的功能,則需要提供 polyfill。如果你自己的程式碼使用這些方法或 JavaScript 最近版本中新增的其他方法,你也需要提供 polyfill。一個 polyfill 選項是 @babel/polyfill,儘管還有許多 其他 策略

語言參考

此參考文件結構化,以便你可以從頭到尾閱讀,如果你喜歡的話。後面的章節會使用之前介紹的概念和語法。假設你熟悉 JavaScript。在以下所有範例中,CoffeeScript 原始碼會顯示在左側,而直接編譯成 JavaScript 的結果會顯示在右側。

你可以按一下右側的 按鈕來執行許多範例(如果適用)。左側的 CoffeeScript 可以編輯,而且 JavaScript 會隨著你的編輯而更新。

首先,基礎知識:CoffeeScript 使用顯著空白來區分程式碼區塊。你不需要使用分號 ; 來終止表達式,換行就可以了(儘管分號仍然可以用於將多個表達式放入單一行中)。不要使用大括號 { } 來包圍 函式if 語句switchtry/catch 中的程式碼區塊,請使用縮排。

如果您傳遞參數,則不需要使用括號來呼叫函數。隱式呼叫會換行或封鎖表達式。
console.log sys.inspect objectconsole.log(sys.inspect(object));

函數

函數由括號中可選的參數清單、箭頭和函數主體定義。空函數看起來像這樣:->

函數也可以對參數有預設值,如果輸入參數遺失(undefined),將會使用該預設值。

字串

與 JavaScript 和許多其他語言一樣,CoffeeScript 支援以 "' 字元為分隔符的字串。CoffeeScript 也支援在 " 引號字串中使用字串內插,方法是使用 #{ … }。單引號字串是文字。您甚至可以在物件鍵中使用內插。

CoffeeScript 允許多行字串。除非以反斜線結尾,否則各行以單一空白鍵連接。縮排會被忽略。

區塊字串以 """''' 為分隔,可用於儲存格式化或縮排敏感的文字(或者,如果你不想跳脫引號和撇號)。區塊開頭的縮排層級會貫穿始終,因此你可以讓它與程式碼主體保持一致。

雙引號區塊字串,就像其他雙引號字串一樣,允許內插。

物件和陣列

物件和陣列的 CoffeeScript 文字與 JavaScript 的表親非常相似。當每個屬性列在自己的行上時,逗號是可選的。物件可以使用縮排建立,而不是明確的大括弧,類似於 YAML

CoffeeScript 有個捷徑,當你想要將金鑰設定為同名的變數時,可以建立物件。請注意,此簡寫需要 {}

註解

在 CoffeeScript 中,註解以 # 字元表示,直到行尾,或從 ### 到下一個 ### 出現。註解會被編譯器忽略,儘管編譯器會盡力在編譯後將註解重新插入輸出 JavaScript 中。

內嵌 ### 註解可以讓 類型註解 成為可能。

詞彙範圍和變數安全性

CoffeeScript 編譯器會確保所有變數都適當地宣告在詞彙範圍內 — 你永遠不需要自己寫 var

請注意,所有變數宣告都已推送到最接近範圍的最上方,在它們首次出現時。outer 沒有在內部函式中重新宣告,因為它已在範圍內;另一方面,函式內的 inner 不應能夠變更同名的外部變數值,因此有它自己的宣告。

由於無法直接存取 var 關鍵字,因此不可能故意遮蔽外部變數,您只能參照它。因此,如果您撰寫的是深度巢狀函式,請小心不要意外重複使用外部變數的名稱。

儘管為了清楚起見而在此文件壓制,所有 CoffeeScript 輸出(除了有 importexport 陳述式的檔案)都包在一個匿名函式中:(function(){ … })();。此安全包裝器與 var 關鍵字的自動產生結合,使得意外污染全域命名空間變得極為困難。(安全包裝器可以使用 bare 選項 停用,並且在使用模組時不必要且會自動停用。)

如果您想要建立供其他腳本使用的頂層變數,請將它們附加為 window 上的屬性;將它們附加為 CommonJS 中 exports 物件上的屬性;或使用 export 陳述式。如果您同時針對 CommonJS 和瀏覽器,存在運算子(如下所述)提供了一個可靠的方法來找出在哪裡新增它們:exports ? this

由於 CoffeeScript 處理所有變數宣告,因此無法使用 ES2015 的 letconst 宣告變數。 這是故意的;我們認為不必考慮變數宣告所獲得的簡潔性,優於擁有三種不同的變數宣告方式的好處。

如果、否則、除非和條件式指定

if/else 陳述式可以不用括號和花括號撰寫。與函式和其他區塊表達式一樣,多行條件式以縮排分隔。還有一個方便的後置形式,ifunless 在最後。

CoffeeScript 可以將 if 陳述式編譯成 JavaScript 表達式,在可能的情況下使用三元運算子,否則使用封閉包裝。CoffeeScript 中沒有明確的三元陳述式 — 您只需在一行上使用常規 if 陳述式即可。

Splat 或 Rest 參數/散佈語法

JavaScript arguments 物件是一種處理接受變數個數參數的函數的實用方式。CoffeeScript 提供 splat ...,用於函數定義和呼叫,讓變數個數的參數變得更易於接受。ES2015 將此功能採納為他們的 Rest 參數

Splat 也讓我們省略陣列元素…

…以及物件屬性。

在 ECMAScript 中,這稱為 展開語法,自 ES2015 以來一直支援陣列,自 ES2018 以來支援物件。

迴圈和推導式

您在 CoffeeScript 中撰寫的大部分迴圈將會是陣列、物件和範圍上的推導式。推導式會取代 (並編譯成) for 迴圈,並提供選用防護子句和目前陣列索引的值。與 for 迴圈不同,陣列推導式是表達式,可以傳回和指定。

理解應能處理大多數你會使用迴圈、each/forEachmapselect/filter 的地方,例如
shortNames = (name for name in list when name.length < 5)
如果你知道迴圈的開始和結束,或想以固定大小的增量逐步執行,你可以使用範圍來指定理解的開始和結束。

請注意,由於我們將理解的值指定給上述範例中的變數,CoffeeScript 會將每次反覆運算的結果收集到陣列中。有時函式會以僅打算執行其副作用的迴圈結束。請小心,在這些情況下,你沒有意外傳回理解的結果,方法是將有意義的傳回值(例如 truenull)新增到函式的底部。

若要以固定大小的區塊逐步執行範圍推論,請使用 by,例如:evens = (x for x in [0..10] by 2)

如果您不需要目前的迭代值,您可以省略它:browser.closeCurrentTab() for [0...count]

推論也可以用來迭代物件中的鍵和值。使用 of 來表示推論物件的屬性,而不是陣列中的值。

如果您只想迭代物件本身定義的鍵,透過加入 hasOwnProperty 檢查來避免可能從原型繼承的屬性,請使用 for own key, value of object

若要迭代產生器函式,請使用 from。請參閱 產生器函式

CoffeeScript 提供的唯一低階迴圈是 while 迴圈。與 JavaScript 的主要差異在於 while 迴圈可以用作表達式,傳回包含迴圈中每次迭代結果的陣列。

為了可讀性,until 關鍵字等於 while not,而 loop 關鍵字等於 while true

當使用 JavaScript 迴圈產生函式時,通常會插入封閉包裝器,以確保迴圈變數被封閉,而且所有產生的函式並非僅共用最後的值。CoffeeScript 提供 do 關鍵字,它會立即呼叫傳遞的函式,轉送任何引數。

使用範圍進行陣列切片和拼接

範圍也可以用來擷取陣列的切片。使用兩個點(3..6),範圍包含(3, 4, 5, 6);使用三個點(3...6),範圍不包含尾端(3, 4, 5)。切片索引有實用的預設值。省略第一個索引預設為零,省略第二個索引預設為陣列大小。

相同的語法可以用於指定,以新值取代陣列的區段,稱為剪接。

請注意 JavaScript 字串是不可變的,無法剪接。

一切都可表達(至少,盡可能)

你可能已經注意到,即使我們沒有在 CoffeeScript 函式中新增 return 陳述式,它們仍然會傳回其最終值。CoffeeScript 編譯器會盡量確保語言中的所有陳述式都能當作表達式使用。請注意,在以下函式中,return 會推入執行緒的每個可能分支。

即使函數總會傳回其最終值,但當您知道已完成時,建議盡早從函數主體傳回並寫出明確的傳回值 (return value)。

由於變數宣告會出現在範圍的最上方,因此可以在表達式中使用指定,即使是之前未曾看過的變數。

在 JavaScript 中原本會是陳述式的內容,在 CoffeeScript 中用作表達式的一部分時,會透過將其包裝在封閉中轉換為表達式。這讓您可以執行有用的操作,例如將理解的結果指定給變數。

除了愚蠢的事情,例如將 try/catch 陳述式直接傳遞到函數呼叫中

JavaScript 中有一些語句無法有意義地轉換成表達式,即 breakcontinuereturn。如果您在程式碼區塊中使用它們,CoffeeScript 就不會嘗試執行轉換。

運算子與別名

由於 == 運算子經常導致不必要的強制轉換,是不及物的,且在其他語言中具有不同的意義,因此 CoffeeScript 將 == 編譯為 ===,將 != 編譯為 !==。此外,is 編譯為 ===isnt 編譯為 !==

您可以使用 not 作為 ! 的別名。

對於邏輯,and 編譯為 &&or 編譯為 ||

then 可用於將條件與表達式分開,而不是換行符或分號,用於 whileif/elseswitch/when 語句。

如同 YAML 中,onyes 與布林值 true 相同,而 offno 與布林值 false 相同。

unless 可用作 if 的反向。

作為 this.property 的捷徑,您可以使用 @property

您可以使用 in 來測試陣列是否存在,並使用 of 來測試 JavaScript 物件金鑰是否存在。

for 迴圈中,from 編譯為 ES2015 of。(是的,這很不幸;CoffeeScript of 早於 ES2015 of。)

為了簡化數學表達式,** 可用於指數運算,// 執行取整除法。% 的運作方式與 JavaScript 中相同,而 %% 提供 “除數依賴模數運算”

現在大家一起來

CoffeeScript JavaScript
===
不是 !==
!
&&
||
trueyeson
falsenooff
@this this
a in b [].indexOf.call(b, a) >= 0
a of b a in b
for a from b for (a of b)
a ** b a ** b
a // b Math.floor(a / b)
a %% b (a % b + b) % b

存在運算子

在 JavaScript 中檢查變數是否存在有點困難。if (variable) … 接近,但對於零、空字串和 false(僅舉最常見的案例)會失敗。CoffeeScript 的存在運算子 ? 會傳回 true,除非變數為 nullundefined 或未宣告,這使其類似於 Ruby 的 nil?

它也可以用於比 JavaScript 模式 a = a || value 提供更安全的條件賦值,適用於您可能處理數字或字串的案例。

請注意,如果編譯器知道 a 在範圍內,因此已宣告,a? 會編譯成 a != null而不是 a !== null!= 會對 null 進行寬鬆比較,同時也對 undefined 進行比較。not a?unless a? 也適用反向比較。

如果變數可能未宣告,編譯器會進行徹底檢查。這是 JavaScript 編碼人員在想要檢查神秘變數是否存在時應該輸入的內容。

存在運算子 ?. 的存取器變體可用於吸收屬性鏈中的 null 參考。在基礎值可能是 nullundefined 的情況下,請使用它來取代點存取器 .。如果所有屬性都存在,您將獲得預期的結果,如果鏈斷開,則會傳回 undefined,而不是會引發的 TypeError

為了完整性

範例 定義
a? 測試 a 是否在作用域中且 a != null
a ? b 如果 a 在作用域中且 a != null 則傳回 a;否則傳回 b
a?.ba?['b'] 如果 a 在作用域中且 a != null 則傳回 a.b;否則傳回 undefined
a?(b, c)a? b, c 如果 a 在作用域中且可呼叫,則傳回呼叫 a 的結果(帶有參數 bc);否則傳回 undefined
a ?= b 如果 a 不在作用域中或 a == null,則將 b 的值指定給 a;產生 a 的新值

串接函式呼叫

開頭的 . 會關閉所有開啟的呼叫,允許使用更簡潔的串接語法。

解構賦值

就像 JavaScript(自 ES2015 起),CoffeeScript 也有解構賦值語法。當你將陣列或物件文字指定給一個值時,CoffeeScript 會將兩邊分解並互相匹配,將右邊的值指定給左邊的變數。在最簡單的情況下,它可用於平行賦值

但它也有助於處理傳回多個值的函式。

解構賦值可用於任何深度陣列和物件巢狀結構,有助於提取深度巢狀屬性。

解構賦值甚至可以與散列結合使用。

展開可用於從陣列尾端擷取元素,而不用賦值給其餘值。它也適用於函式參數清單。

解構賦值與類別建構函式結合使用時也很有用,可以將屬性從傳遞給建構函式的選項物件指派給你的執行個體。

上述範例也說明了如果解構物件或陣列中缺少屬性,你可以像在 JavaScript 中一樣提供預設值。不過請注意,與存在運算子不同,預設值只會在值遺失或為 undefined 時套用—傳遞 null 會設定值為 null,而不是預設值。

繫結(胖箭頭)函式

在 JavaScript 中,this 關鍵字會動態範圍化,表示目前函式附加到的物件。如果你傳遞函式作為回呼或將其附加到其他物件,this 的原始值將會遺失。如果你不熟悉此行為,這篇 Digital Web 文章 對其怪異之處有很好的概述。

胖箭頭 => 可用於定義函式,並將其繫結到 this 的目前值,就在現場。這在使用基於回呼的函式庫(例如 Prototype 或 jQuery)時很有用,用於建立要傳遞給 each 的反覆運算函式,或與 on 一起使用的事件處理函式。使用胖箭頭建立的函式可以存取它們定義所在 this 的屬性。

如果我們在上述回呼中使用 ->@客戶 會參考 DOM 元素未定義的「客戶」屬性,並且嘗試對其呼叫 購買() 會引發例外。

胖箭頭是 CoffeeScript 最受歡迎的功能之一,而 ES2015 採用了它;因此 CoffeeScript 2 編譯 => 至 ES =>

產生器函數

CoffeeScript 支援 ES2015 產生器函數,透過 yield 關鍵字。沒有 function*(){} 的無稽之談 — CoffeeScript 中的產生器只是一個會產生結果的函數。

yield* 稱為 yield from,如果你需要強制不產生結果的產生器,可以使用 yield return

你可以使用 for…from 遍歷產生器函數。

非同步函式

ES2017 的 非同步函式 透過 await 關鍵字獲得支援。與產生器一樣,不需要 async 關鍵字;CoffeeScript 中的非同步函式只是一個等待的函式。

類似於 yield return 強制產生器,await return 可用於強制函式成為非同步。

類別

CoffeeScript 1 提供了 classextends 關鍵字作為與原型函數一起工作的語法糖。有了 ES2015,JavaScript 採用了這些關鍵字;因此 CoffeeScript 2 將其 classextends 關鍵字編譯到 ES2015 類別。

使用 @ 在方法名稱之前可以定義靜態方法

最後,類別定義是可執行程式碼區塊,可產生有趣的元程式設計可能性。在類別定義的內容中,this 是類別物件本身;因此,你可以使用 @property: value 指派靜態屬性。

原型繼承

除了支援 ES2015 類別之外,CoffeeScript 也提供一個捷徑來處理原型。:: 營運子讓你快速存取物件的原型

Switch/When/Else

JavaScript 中的 switch 陳述式有點尷尬。你需要記得在每個 case 陳述式的結尾處 break,以避免意外落入預設情況。CoffeeScript 會防止意外落入,並且可以將 switch 轉換為可回傳、可指派的表達式。格式為:switch 條件,when 子句,else 預設情況。

與 Ruby 一樣,CoffeeScript 中的 switch 陳述式可以為每個 when 子句採用多個值。如果任何值相符,子句就會執行。

switch 陳述式也可以在沒有控制表達式的情況下使用,將它們變成 if/else 鏈的更乾淨的替代方案。

Try/Catch/Finally

try 表達式具有與 JavaScript 中的 try 陳述式相同的語意,儘管在 CoffeeScript 中,您可以省略 catch 和 finally 部分。如果不需要,catch 部分也可以省略 error 參數。

鏈式比較

CoffeeScript 借用了 Python 的鏈式比較,讓測試值是否落在特定範圍內變得容易。

區塊正規表示式

類似於區塊字串和註解,CoffeeScript 支援區塊正規表示式,這是一種忽略內部空白字元且可以包含註解和內插的延伸正規表示式。CoffeeScript 的區塊正規表示式是以 Perl 的 /x 修飾符為範本,並以 /// 為分隔符號,對於讓複雜的正規表示式變得易讀有很大的幫助。引用 CoffeeScript 原始碼

標籤範本字面值

CoffeeScript 支援 ES2015 標籤範本字面值,這可以自訂字串內插。如果你在字串前面加上一個函式名稱(兩者之間沒有空格),CoffeeScript 會將這個「函式加字串」組合輸出成 ES2015 標籤範本字面值,這將會 相應地執行:呼叫函式,並將參數設定為構成內插字串的輸入文字和表達式部分。然後函式可以將這些部分組裝成輸出字串,提供自訂的字串內插。

模組

ES2015 模組 在 CoffeeScript 中受支援,具有非常相似的 importexport 語法

動態匯入也受到支援,但必須加上括號

請注意 CoffeeScript 編譯器不會解析模組;在 CoffeeScript 中撰寫 importexport 陳述式會在產生的輸出中產生 importexport 陳述式。所有現代瀏覽器(當透過 <script type="module"> 參照指令碼時)和 Node.js(當輸出 .js 檔案位於最近父項 package.json 檔案包含 "type": "module" 的資料夾中時)都可以執行這些陳述式。由於執行時間正在評估產生的輸出,因此 import 陳述式必須參照輸出檔案;因此,如果 file.coffee 輸出為 file.js,則需要在 import 陳述式中將其參照為 file.js,並包含 .js 副檔名。

此外,任何包含 importexport 陳述式的檔案都將在沒有 頂層函式安全性包裝器 的情況下輸出;換句話說,匯入或匯出模組會自動觸發該檔案的 模式。這是因為根據 ES2015 規格,importexport 陳述式必須出現在最頂層範圍。

嵌入式 JavaScript

希望您永遠不需要使用它,但如果您需要在 CoffeeScript 中穿插 JavaScript 片段,可以使用反引號直接傳遞它。

使用反斜線跳脫反引號: \`​ 變成 `​

使用更多反斜線跳脫反引號前的反斜線: \\\`​ 變成 \`​

您也可以使用三個反引號來嵌入 JavaScript 區塊。如果您需要在 JavaScript 區塊內使用反引號,這比跳脫反引號更容易。

JSX

JSX 是一種包含穿插 XML 元素的 JavaScript。儘管是為 React 而設計,但它並非特定於任何特定函式庫或架構。

CoffeeScript 支援穿插 XML 元素,無需額外的外掛程式或特殊設定。XML 元素將會編譯為 JSX,並輸出可以像任何一般 JSX 檔案一樣解析的 JSX,例如透過 具有 React JSX 轉換功能的 Babel。CoffeeScript 不會 輸出 React.createElement 呼叫或特定於 React 或任何其他架構的程式碼。您必須在建置鏈中加入另一個步驟,將此 JSX 轉換為您希望 XML 元素編譯成的任何函式呼叫。

就像在 JSX 和 HTML 中一樣,使用 <> 表示 XML 標籤。您可以在標籤中使用 {} 內插 CoffeeScript 程式碼。為避免編譯器錯誤,當使用 <> 表示「小於」或「大於」時,您應該在運算子周圍加上空格,以區別它們與 XML 標籤。因此是 i < len,而不是 i<len。編譯器會盡量寬容,只要它能確定您的意圖,但始終在「小於」和「大於」運算子周圍加上空格將有助於消除歧義。

較舊的 CoffeeScript 外掛或分支支援 JSX 語法,並稱之為 CSX 或 CJSX。它們也常使用 .cjsx 檔案副檔名,但這已不再是必要的;一般的 .coffee 即可。

類型註解

在 CoffeeScript 中,可使用 Flow註解類型語法 來達成靜態類型檢查

CoffeeScript 本身不會進行任何型別檢查;您在上方看到的 JavaScript 輸出需要傳遞給 Flow,以便驗證您的程式碼。我們預期大多數人會使用 建置工具 來執行這項工作,但以下說明使用 CoffeeScriptFlow 命令列工具執行最簡單的方法,假設您已在專案資料夾中 安裝 Flow最新的 CoffeeScript

coffee --bare --no-header --compile app.coffee && npm run flow

--bare--no-header 很重要,因為 Flow 要求檔案的第一行是註解 // @flow。如果您將建置鏈配置為編譯 CoffeeScript,並將結果傳遞給 Flow 內存,您可以獲得比這個範例更好的效能;而且適當的建置工具應該能夠監控您的 CoffeeScript 檔案,並在儲存時重新編譯和為其進行型別檢查。

如果您知道使用 CoffeeScript 達成靜態型別檢查的其他方法,請 建立問題 並讓我們知道。

Literate CoffeeScript

除了作為一種普通的程式語言使用之外,CoffeeScript 也可用於「文學」模式。如果您將檔案命名為 .litcoffee 副檔名,您可以將其寫成 Markdown 文件,也就是同時也是可執行 CoffeeScript 程式碼的文件。編譯器會將任何縮排區塊(Markdown 指示原始程式碼的方式)視為可執行程式碼,並將其餘部分視為註解而忽略。程式碼區塊也必須至少以一個空白行與註解分隔。

僅供參考,目前已採用這種方式實作編譯器的部分內容:請參閱 文件原始檔,以及 在文字編輯器中正確突顯

注意事項

  • 程式區塊必須維持彼此之間一致的縮排。當編譯器解析您的 Literate CoffeeScript 檔案時,它會先捨棄所有非程式區塊的列,然後將剩餘部分解析為一般的 CoffeeScript 檔案。因此,程式區塊必須寫成彷彿註解列不存在,並維持一致的縮排(包括縮排時使用的是 tab 還是空白)。
  • 沿著這些列,清單項目或區塊引號內的程式區塊不會被視為可執行的程式碼。由於清單項目和區塊引號暗示自己的縮排,因此在某些區塊內,而另一些區塊不在時,如何處理連續程式區塊之間的縮排會很模糊。
  • 清單項目最多只能有一段落長。清單項目的第二段落會在空白列之後縮排,因此與程式區塊無法區分。

原始碼對應表

CoffeeScript 包含支援產生原始碼對應表的程式,這是一種告訴您的 JavaScript 引擎,您的 CoffeeScript 程式中哪一部分與正在評估的程式碼相符。支援它的瀏覽器可以自動使用原始碼對應表,在偵錯器中顯示您的原始程式碼。若要在 JavaScript 檔案旁邊產生原始碼對應表,請將 --map-m 旗標傳遞給編譯器。

有關原始碼對應表的完整介紹、它們如何運作以及如何在瀏覽器中連結它們,請閱讀 HTML5 教學

蛋糕和 Cakefiles

CoffeeScript 包含一個(非常)簡單的建置系統,類似於 MakeRake。當然,它稱為 Cake,並用於建置和測試 CoffeeScript 語言本身的任務。任務定義在名為 Cakefile 的檔案中,並且可以透過從目錄中執行 cake [task] 來呼叫。若要列印所有任務和選項的清單,只要輸入 cake 即可。

任務定義是用 CoffeeScript 編寫的,因此您可以在 Cakefile 中放入任意程式碼。使用名稱、長描述和在執行任務時要呼叫的函數來定義任務。如果您的任務需要命令列選項,您可以使用簡短和長旗標來定義選項,並且它將在 options 物件中提供。以下是一個使用 Node.js API 來重建 CoffeeScript 的剖析器的任務

如果您需要在執行另一個任務之前呼叫一個任務,例如在執行 test 之前執行 build,您可以使用 invoke 函式:invoke 'build'。Cake 任務是一種將 CoffeeScript 函式公開到命令列的最小方式,因此 請勿期待任何內建的奇特功能。如果您需要相依關係或非同步回呼,最好將它們放在您的程式碼本身,而不是 Cake 任務中。

"text/coffeescript" Script 標籤

雖然不建議用於嚴肅用途,但 CoffeeScript 可以使用 <script type="text/coffeescript"> 標籤直接包含在瀏覽器中。原始碼包含編譯器的壓縮和縮小版本 (在此處下載目前版本,壓縮後為 77k),為 docs/v2/browser-compiler-legacy/coffeescript.js。在包含內嵌 CoffeeScript 標籤的頁面上包含此檔案,它將依序編譯和評估它們。

CoffeeScript 的一般注意事項適用於您的內嵌指令碼將在封閉包裝中執行,因此如果您想要公開全域變數或函式,請將它們附加到 window 物件。

整合

CoffeeScript 是龐大 JavaScript 生態系統的一部分,許多函式庫可協助將 CoffeeScript 與 JavaScript 整合。主要專案,特別是更新為與 CoffeeScript 2 搭配使用的專案,在此處列出;可以在 Wiki 頁面 中找到更多內容。如果您認為應該將某個專案新增到此區段,請開啟問題或 發出拉取要求。專案依類別按字母順序列出。

建置工具

程式碼編輯器

架構

程式碼檢查和格式化

測試

資源

  • GitHub 上的 CoffeeScript
  • CoffeeScript 問題
    關於錯誤回報、功能建議和語言變更的想法都屬於這裡。
  • CoffeeScript Google 群組
    如果你想提出問題,這個郵件列表是一個獲得協助的好地方。
  • CoffeeScript Wiki
    如果你曾經學到一個很棒的 CoffeeScript 技巧或訣竅,或遇到一個陷阱,請在 Wiki 上分享。
  • 常見問題
    也許你的 CoffeeScript 相關問題以前已經被問過。請先查看常見問題。
  • JS2Coffee
    是一個非常棒的 JavaScript 轉 CoffeeScript 編譯器。它不會完美無缺(推論你的 JavaScript 類別,當你需要綁定函式時,等等…)— 但它是轉換簡單腳本的絕佳起點。
  • 高解析度標誌
    CoffeeScript 標誌提供 SVG 格式,可供簡報使用。

書籍

有許多絕佳資源可以幫助你開始使用 CoffeeScript,其中一些可以在網路上免費取得。

螢幕錄影

  • A Sip of CoffeeScriptCode School Course,結合 6 個螢幕錄影和瀏覽器內編碼,讓學習變得有趣。第一級可以免費試用。
  • Meet CoffeeScript 是 PeepCode 製作的 75 分鐘螢幕錄影,現在由 PluralSight 擁有。它以動畫說明 CoffeeScript 轉換為等效 JS 的方式,令人印象深刻。
  • 如果您想花較少時間,RailsCasts 的 CoffeeScript Basics 應該可以滿足您的需求,在 11 分鐘內說明 CoffeeScript 的所有重要注意事項。

範例

可以在 GitHub 上找到 最佳的開源 CoffeeScript 範例清單。但只列出幾個

  • GitHubHubot,一個友善的 IRC 機器人,可以執行許多有用和無用的任務。
  • sstephensonPow,一個零組態的 Rack 伺服器,具有全面的註解原始碼。
  • technoweenieCoffee-Resque,一個 Node.js 的 Resque 移植。
  • stephankOrona,為現代瀏覽器打造的 Bolo 坦克遊戲重製版。
  • GitHubAtom,建構在網路技術上的可駭入文字編輯器。
  • BasecampTrix,適用於網路應用程式的豐富文字編輯器。

網路聊天(IRC)

通常可以在 irc.freenode.net 上的 CoffeeScript IRC 室 #coffeescript 找到快速協助和建議,你可以 透過網路瀏覽器加入

註解原始碼

你可以瀏覽以可讀取的註解形式呈現的 CoffeeScript 2.7.0 原始碼 在此。你也可以直接跳到特定的原始碼檔案

貢獻

歡迎貢獻!請隨時分岔 儲存庫 並提交拉取請求。

ECMAScript 的某些功能是故意不支援的。請檢閱 GitHub 上的開啟和關閉問題,以查看你正在尋找的功能是否已經討論過。一般來說,我們不支援尚未定案(在 提案核准流程 中為第 4 階段)或尚未在主要瀏覽器和/或 Node 中實作的 ECMAScript 語法(有時會發生在第 3 階段的功能)。CoffeeScript 選擇支援的任何第 3 階段功能都應視為實驗性質,在功能達到第 4 階段之前,可能會進行重大變更或移除。

有關加入 CoffeeScript 的更多資源,請參閱 Wiki,特別是 解析器運作方式

您可以採取多種措施來增加您的提交請求被接受的機率

  • 建立測試!任何提交請求都應該包含基本測試,以驗證您沒有損壞任何東西,或未來的變更不會損壞您的程式碼。
  • 遵循 CoffeeScript 程式碼庫其他部分的樣式。
  • 確保任何 ECMAScript 語法都已成熟(在第 4 階段,或在第 3 階段,並在主要瀏覽器或執行時間環境中獲得支援)。
  • 僅新增具有廣泛實用性的功能,而不是針對特定使用案例或架構的功能。

當然,您很有可能有一個很棒的補充,但它不符合這些限制。歡迎提出您自己的解決方案;您將有 許多夥伴

不支援的 ECMAScript 功能

有幾個 ECMAScript 功能是 CoffeeScript 故意不支援的。

letconst:區塊範圍和重新指派保護的變數

在設計 CoffeeScript 時,var 故意省略。這是為了讓開發人員不必擔心變數宣告var foo)和變數指派foo = 1)的心理負擔。CoffeeScript 編譯器會自動在每個函數範圍的頂端產生 var 陳述式,為您處理宣告。這使得意外宣告全域變數變得不可能。

letconst 為 JavaScript 加入了一個實用的功能,讓您可以在 區塊 範圍內宣告變數,例如在 if 陳述式主體或 for 迴圈主體中,而 var 則總是宣告變數在整個函式的範圍內。在設計 CoffeeScript 2 時,對於這個功能是否足夠實用以勝過於 CoffeeScript 中永遠不需要考慮變數宣告的簡潔性,有過許多討論。最後,決定簡潔性更為重要。在 CoffeeScript 中,只保留一種變數類型。

請記住,const 只會保護您免於 重新指派 變數;它不會阻止變數的值改變,這與其他語言中的常數通常會做的事不同

const obj = {foo: 'bar'};
obj.foo = 'baz'; // Allowed!
obj = {}; // Throws error

命名函式和函式宣告

CoffeeScript 的新手常常想知道如何產生 JavaScript function foo() {},而不是 CoffeeScript 產生的 foo = function() {}。第一個形式是 函式宣告,第二個形式是 函式表達式。如上所述,在 CoffeeScript 中 一切都為表達式,所以我們自然偏好表達式形式。只支援一種變體有助於避免因這 兩種形式之間的細微差異 而產生的令人困惑的錯誤。

技術上來說,foo = function() {} 是在建立一個匿名函式,並將它指定給一個名為 foo 的變數。某些非常早期的 CoffeeScript 版本會為這個函式命名,例如 foo = function foo() {},但因為與 Internet Explorer 相容性的問題而捨棄了這種做法。這讓許多人感到困擾了一陣子,因為這些函式在堆疊追蹤中會是沒有名稱的;但現代 JavaScript 執行環境 會從這些匿名函式被指定到的變數名稱推論出它們的名字。既然如此,最簡單的方法就是維持目前的行為。

getset 關鍵字簡寫語法

getset,作為函式或類別方法前面的關鍵字,在 CoffeeScript 中是刻意不實作的。

這是為了避免語法上的歧義,因為在 CoffeeScript 中,這樣的結構看起來和函式呼叫一模一樣(例如 get(function foo() {}));而且有一個 替代語法,雖然稍微冗長,但一樣有效

CoffeeScript 1.x 至 2 的重大變更

CoffeeScript 2 旨在輸出盡可能多的慣用語法 ES2015+ 語法,同時盡可能減少與 CoffeeScript 1.x 的重大變更。遺憾的是,有些重大變更是無法避免的。

繫結(胖箭頭)函式

在 CoffeeScript 1.x 中,=> 編譯為正規的 function,但會將對 this/@ 的參照改寫為使用外部範圍的 this,或透過 .bind 將內部函式繫結到外部範圍(因此稱為「繫結函式」)。在 CoffeeScript 2 中,=> 編譯為 ES2015 的 =>,其行為略有不同。最大的不同在於在 ES2015 中,=> 函式缺乏 arguments 物件

函式參數和解構元素的預設值

根據 ES2015 函式預設參數規格解構預設值,預設值僅在值遺失或為 undefined 時套用。在 CoffeeScript 1.x 中,預設值會在這些情況下套用,但如果值為 null 時也會套用。

繫結產生器函式

繫結產生器函式,又稱產生器箭頭函式,ECMAScript 中不允許。您可以撰寫 function*=>,但不能同時使用。因此,類似以下的 CoffeeScript 程式碼

f = => yield this
# Throws a compiler error

需要以舊式方法重新撰寫

類別編譯為 ES2015 類別

ES2015 類別及其方法有一些限制,超出一般函式的限制。

類別建構函式無法在沒有 new 的情況下呼叫

(class)()
# Throws a TypeError at runtime

ES2015 類別不允許繫結(粗箭頭)方法。CoffeeScript 編譯器會經過一些扭曲來保留對它們的支持,但有一件事無法解決,就是在繫結之前呼叫繫結方法

class Base
  constructor: ->
    @onClick()      # This works
    clickHandler = @onClick
    clickHandler()  # This throws a runtime error

class Component extends Base
  onClick: =>
    console.log 'Clicked!', @

類別方法無法與 new 一起使用(不常見)

class Namespace
  @Klass = ->
new Namespace.Klass  # Throws a TypeError at runtime

由於編譯為 ES2015 類別所需的提升,類別方法中的動態金鑰無法使用可執行類別主體中的值,除非以原型樣式指定方法。

class A
  name = 'method'
  "#{name}": ->   # This method will be named 'undefined'
  @::[name] = ->  # This will work; assigns to `A.prototype.method`

superthis

在衍生類別(extends 另一個類別的類別)的建構函式中,在呼叫 super 之前無法使用 this

class B extends A
  constructor: -> this  # Throws a compiler error

這也表示您無法在衍生類別的建構函式中將對 this 的參考作為引數傳遞給 super

class B extends A
  constructor: (@arg) ->
    super @arg  # Throws a compiler error

這是 ES2015 類別的限制。作為解決方法,在 super 呼叫之後指定 this

superextends

由於 super 與存取器發生語法衝突,因此「單純」的 super(沒有括號的 super 關鍵字)不再編譯為轉送所有引數的 super 呼叫。

class B extends A
  foo: -> super
  # Throws a compiler error

可以使用展開語法明確轉送引數

或者,如果您知道父函式不需要引數,只要呼叫 super() 即可

CoffeeScript 1.x 允許 extends 關鍵字設定函式之間的原型繼承,而 super 可以手動用於原型指派函式

A = ->
B = ->
B extends A
B.prototype.foo = -> super arguments...
# Last two lines each throw compiler errors in CoffeeScript 2

由於切換到 ES2015 extendssuper,因此不再支援使用這些關鍵字來進行原型函式。上述案例可以重構為

JSX 和 <> 算子

使用 JSX 時,<> 字元既可用作「小於」和「大於」算子,也可用作 XML 標籤的分隔符號,例如 <div>。通常,為了獲得最佳效果,您應該始終在算子周圍加上空格,以將它們與 XML 標籤區分開來:i < len,而不是 i<len。編譯器會盡量寬容,但始終在「小於」和「大於」算子周圍加上空格可以消除歧義。

Literate CoffeeScript 解析

CoffeeScript 2 的 Literate CoffeeScript 解析經過重新編寫,現在會更小心地不將縮排清單視為程式碼區塊;但這表示所有程式碼區塊(除非要將它們解釋為註解)都必須與清單之間至少隔開一空白行。

程式碼區塊現在也應該維持一致的縮排層級,因此一個 tab 的縮排(或您認為是 tab 停駐點的任何內容,例如 2 個空格或 4 個空格)應視為程式碼的「左邊界線」,檔案中的所有程式碼都相對於該欄位。

您希望成為註解一部分且不執行的程式碼區塊必須至少有一行(理想情況下是區塊的第一行)完全沒有縮排。

引數解析和 shebang (#!) 行

在 CoffeeScript 1.x 中,必須在要執行的腳本路徑和檔名後,但在傳遞給該腳本的任何引數之前,加上 --。此慣例現已棄用。因此,請勿

coffee [options] path/to/script.coffee -- [args]

現在您只需輸入

coffee [options] path/to/script.coffee [args]

已棄用的版本仍然可以使用,但它會在執行腳本之前印出警告。

在非 Windows 平台上,可以透過在檔案頂端新增 shebang (#!) 行並將檔案標示為可執行,讓 .coffee 檔案可執行。例如

#!/usr/bin/env coffee

x = 2 + 2
console.log x

如果將此儲存為 executable.coffee,則可以讓它具有可執行性並執行

chmod +x ./executable.coffee
▶ ./executable.coffee
4

在 CoffeeScript 1.x 中,這會在嘗試將引數傳遞給指令碼時失敗。OS X 上的一些使用者透過使用 #!/usr/bin/env coffee -- 作為檔案的第一行來解決此問題。然而,這在 Linux 上無法運作,因為它無法解析具有多個引數的 shebang 行。雖然此類指令碼仍會在 OS X 上執行,但 CoffeeScript 現在會在編譯或評估以過長的 shebang 行開頭的檔案之前顯示警告。由於 CoffeeScript 2 支援在不需要 -- 的情況下傳遞引數,我們建議僅將此類指令碼中的 shebang 行變更為 #!/usr/bin/env coffee

變更日誌

2.7.0

  • 匯入宣告語法 現在獲得支援。這允許使用 export { version } from './package.json' assert { type: 'json' } 等陳述式或 import('./calendar.json', { assert { type: 'json' } }) 等運算式。
  • CoffeeScript 不再總是修補 Node 的錯誤堆疊追蹤。此修補會調整行號和欄位號碼,以符合原始碼 CoffeeScript,而非產生的 JavaScript,這會與其他函式庫產生衝突,而且在傳遞 Node 的新 --enable-source-maps 旗標 時並非必要。現在,只有在未設定 --enable-source-maps、沒有其他函式庫已修補堆疊追蹤,以及使用 require('coffeescript/register') 時,才會進行修補。可以透過 require('coffeescript').patchStackTrace()import { patchStackTrace } from 'coffeescript'; patchStackTrace() 明確啟用修補。
  • 修正一個問題,其中區塊(三引號)字串無法正確轉譯成包覆範本文字的 JSX 運算式容器(例如 <div a={`...`} />)。
  • 修正錯誤,在明確的 [ 陣列或 { 物件文字的非空第一行,換行符號不會按照預期運作。

2.6.1

  • coffeescript 套件本身現在支援命名匯出,供 Node.js 中的 ES 模組使用;換句話說,現在可以使用 import { compile } from 'coffeescript',而不再只能使用 import CoffeeScript from 'coffeescript'
  • 修正錯誤,在非裸模式下編譯大型檔案時會發生堆疊溢位錯誤。

2.6.0

2.5.1

  • 物件展開現在可以包含原型簡寫,例如 a = {b::c...};以及浸泡,例如 a = {b?.c..., d?()...}
  • 修正錯誤,在 2.5.0 中的回歸,其中使用 Windows 樣式行尾的檔案編譯速度變慢許多。
  • 修正錯誤,在較大的隱式物件內,換行符號關鍵字(例如 or)後面的隱式物件。

2.5.0

  • 編譯器現在支援新的 ast 選項,可透過命令列上的 --ast 或 Node API 中的 ast 使用。此選項會輸出「抽象語法樹」,或輸入 CoffeeScript 原始碼的 JSON 類似表示。此 AST 盡可能遵循 Babel 規格,以與處理 JavaScript 原始碼的工具相容。使用此新 AST 輸出的兩個工具為 eslint-plugin-coffee,一個透過 ESLint 檢查 CoffeeScript 的外掛程式;以及 prettier-plugin-coffeescript,一個透過 Prettier 重新格式化 CoffeeScript 原始碼的外掛程式。CoffeeScript AST 的結構和屬性並非最終版本,可能會在 CoffeeScript 版本之間進行重大變更;如果您有興趣建立新的整合,請 開啟問題
  • 數字分隔符號 現在在 CoffeeScript 中受支援,遵循與 JavaScript 相同的語法:1_234_567
  • BigInt 數字 現在在 CoffeeScript 中受支援,遵循與 JavaScript 相同的語法:42n
  • '''""" 字串現在輸出為更易讀的 JavaScript 範本文字,或反引號 (`) 字串,使用實際換行符號而非 \n 換行符號。
  • 類別現在可以包含計算屬性,例如 [someVar]: ->@[anotherVar]: ->
  • JSX 標籤現在可以包含 XML 風格的命名空間,例如 <image xlink:href="data:image/png" /><Something:Tag></Something:Tag>
  • 修正了冒號後面的註解未顯示在輸出中;保留字錯誤地被禁止作為 JSX 屬性;多行陣列中的縮排前置省略;以及原始碼對應中的無效位置資料等錯誤。

2.4.1

  • 傳統的 ES5現代化 ES 模組 版本的 CoffeeScript 瀏覽器編譯器現在已發布到 NPM,讓瀏覽器編譯器可以使用透過公共 CDN 提供 NPM 模組程式碼的服務。傳統版本透過 package.json "browser" 欄位來參考,而 ES 模組版本則透過 "module" 欄位來參考。

2.4.0

  • 現在支援動態 import() 表達式。括號總是必要的,以區別於 import 陳述式。請參閱 模組。請注意,在撰寫本文時,JavaScript 功能本身仍處於第 3 階段;如果在完全標準化之前發生變更,CoffeeScript 中也可能會發生變更。在 ECMAScript 提議 完成之前使用 import() 應視為暫定的,如果提議發生變更或被拒絕,則可能會發生重大變更。我們也已修改我們在第 3 階段 ECMAScript 功能上的 政策,以在這些功能在主要瀏覽器或 Node.js 等重要執行環境中 發布 時提供支援。
  • 現在有兩個 CoffeeScript 編譯器的瀏覽器版本:已經發布多年的傳統版本,以及可透過 import 使用的新 ES 模組版本。如果您的瀏覽器支援,它將在此頁面上生效。ES 模組瀏覽器編譯器的參考在 package.json "module" 欄位中。
  • Node API 現在公開先前私有的 registerCompiled 方法,以允許使用 coffeescript 套件的外掛程式利用 CoffeeScript 的內部快取。
  • 修正了區塊陣列中字串中的逗號、類別中的 do 區塊中未保留對 @ 的參考,以及函式預設參數不應再被多餘的括號包住。

2.3.2

  • Babel 7 現在受到支援。在版本 7 中,Babel 團隊已從 NPM 上的 babel-core 移至 @babel/core。現在,CoffeeScript --transpile 選項將會先搜尋 @babel/core(Babel 版本 7 及以上),然後再搜尋 babel-core(版本 6 及以下),以嘗試尋找已安裝的 Babel 版本,以用於轉譯。
  • 語法 new.target 現在受到支援。
  • 現在,您可以使用縮排物件來接續關鍵字 yield,就像已經允許 return 及其他關鍵字一樣。
  • 先前,JSX 標籤或屬性中的任何註解都會導致插值大括號({})被輸出。這僅適用於行(#,或 JavaScript 中的 //)註解,而非此處(###,或 /* */)註解;因此,現在編譯器會檢查所有會觸發大括號的註解是否為此處註解,如果是,則不會產生不必要的插值大括號。

2.3.1

  • 傳回與另一個 JSX 標籤相鄰的 JSX 標籤(與傳回根 JSX 標籤或片段相反),是無效的 JSX 語法。Babel 會因此擲回錯誤,現在 CoffeeScript 編譯器也會這麼做。
  • JSX 插值(<tag>{ ... }</tag> 的中間)中無效的縮排現在會擲回錯誤。
  • 瀏覽器編譯器(用於 Try CoffeeScript 和類似的網路式 CoffeeScript 編輯器)現在會在全域範圍中評估程式碼,而非瀏覽器編譯器的範圍。這會改善透過瀏覽器編譯器執行的程式碼效能。
  • 語法清理:現在,隱含函式呼叫可以將沒有主體的類別作為引數,而 ?:: 現在在暗示換行方面與 :: 的行為相同。

2.3.0

  • 此版本新增了對 ES2018 中所有新功能和語法的支援,這些功能和語法在 CoffeeScript 中尚未提供。對於以下所有功能,請務必 轉譯,除非您知道您的目標執行時間支援每個功能。
  • 非同步迭代器現在受支援。您現在可以使用 yield 呼叫 await,例如 do -> until file.EOF then yield await file.readLine()
  • 物件 splat/解構,又稱為物件 rest/spread 語法,已標準化為 ES2018 的一部分,因此此版本移除了先前支援此語法的 polyfill。類似 {a, b, rest...} = obj 的程式碼現在的輸出大致上與其顯示方式相同,而非轉換成 Object.assign 呼叫。請注意,Object.assign polyfill 與原生實作之間存在一些細微差異
  • ES2018 中 JavaScript 新增了指數運算子 ** 和指數賦值運算子 **=。現在類似 a ** 3 的程式碼會依其顯示方式輸出,而非像以前一樣轉換成 Math.pow(a, 3)
  • 正規表示式現在支援 s (dotAll) 旗標。

2.2.4

  • for 迴圈中的 by 值為文字數字時,例如 for x in [2..1] by -1,需要較少的檢查才能確定迴圈是否在範圍內。
  • 修正 2.2.0 中的回歸錯誤,其中括號內的陳述式,例如 (fn(); break) while condition,會編譯。類似 breakreturn 的純粹陳述式無法將括號區塊轉換成運算式,且應擲回錯誤。

2.2.3

  • 修正物件解構的錯誤,其中鍵值為空陣列:{ key: [] } = obj
  • 修正陣列解構到附加至 this 的目標的錯誤:[ @most... , @penultimate, @last ] = arr

2.2.2

  • 修正 2.2.0 中的回歸問題,其中具有 by(步驟)值的範圍以與範圍相反的方向遞增或遞減,會傳回包含範圍第一個值的陣列,而它應該傳回一個空陣列。換句話說,x for x in [2..1] by 1 應等於 [],而不是 [2](因為步驟值為正 1,向上計算,而範圍從 2 到 1,向下計算)。
  • 修正允許在 importexport 陳述式和觸發縮排區塊開頭的行(例如 if 陳述式)中使用反斜線的錯誤。

2.2.1

  • 修正 2.2.0 中的回歸問題,涉及在陣列中使用解構與散列或展開時,編譯器在某些情況下拋出的錯誤。
  • 修正 2.2.0 中的回歸問題,在某些情況下,範圍迭代器變數會在全域範圍內宣告。

2.2.0

  • 此版本修正了所有目前公開的錯誤,最早可以追溯到 2014、2012 和 2011 年。
  • 潛在的重大變更:帶有不明確 else 的內嵌 ifswitch 陳述式,例如 if no then if yes then alert 1 else alert 2,現在編譯時 else 永遠對應於最接近的開啟 then。先前不明確 else 的行為是無法預測的。如果您的程式碼有任何帶有多個 then(和一個或多個 else)的 if … thenswitch … then 陳述式,編譯的輸出現在可能不同,除非您已透過括號解決不明確性。我們做出此變更,是因為先前的行為不一致,基本上是一個錯誤:取決於語法所在的位置,例如如果有內嵌函式或暗示區塊的某個內容,else 可能會繫結到較早的 then,而不是較後的 then。現在 else 基本上會關閉由 then 開啟的區塊,類似於關閉開啟的括號。
  • 當缺少必要的 then 時,錯誤會更精確地指出錯誤所在位置。
  • 當在不支援 CoffeeScript 編譯器本身所需的某些 ES2015 JavaScript 功能的環境中執行 coffee 指令時,會擲回錯誤。如果 CoffeeScript 安裝在低於版本 6 的 Node 中,可能會發生這種情況。
  • 使用非最終的展開/散佈進行解構,例如 [open, contents..., close] = tag.split('') 現在使用 ES2015 剩餘語法進行輸出。
  • 命名為 getset 的函式可以在更多情況下不使用括號,包括附加到 this@?. 時;或當第一個引數是隱含物件時,例如 @set key: 'val'
  • 現在可以在括號內使用 break 等陳述式,例如 (doSomething(); break) while condition(pick(key); break) for key of obj
  • 修正了在解構中指派到附加到 this/@ 的屬性的錯誤,例如 ({@prop = yes, @otherProp = no}) ->
  • 修正錯誤,當參數附加到 this 時,會錯誤地拋出呼叫 super 的錯誤,而該參數位於較低範圍內,例如 class Child extends Parent then constructor: -> super(-> @prop)
  • 修正錯誤,以防止當 for 迴圈給定變數以逐步執行時,可能會產生無限迴圈,例如 for x in [1..3] by step(相對於 by 0.5 或其他基本數值)。
  • 修正錯誤,在評估範圍時不再宣告迭代器變數兩次,例如 end = 3; fn [0..end]
  • 修正錯誤,在鏈式呼叫中變數的範圍不正確,例如 start(x = 3).then(-> x = 4)
  • 修正錯誤,傳遞給 do 的函式中變數的範圍不正確,例如 for [1..3] then masked = 10; do -> alert masked
  • 修正錯誤,函式呼叫中不再為尾隨逗號拋出語法錯誤,例如 fn arg1, arg2,
  • 修正錯誤,在屬性存取中的表達式,例如 a[!b in c..]
  • 修正錯誤,允許在 for 行中的任何點使用行延續反斜線 (\)。

2.1.1

  • 修正錯誤,設定可執行類別主體的正確內容。因此在 class @B extends @A then @property = 1 中,@property 中的 @ 現在是指類別,而不是全域物件。
  • 修正錯誤,匿名類別使用相同的自動變數名稱建立。現在每個類別都會收到唯一的名稱,以避免互相覆寫。

2.1.0

  • 現在支援物件文字中的計算屬性金鑰:obj = { ['key' + i]: 42 },或 obj = [Symbol.iterator]: -> yield i++
  • 陣列元素的跳過,又稱為省略,現在已獲得支援:arr = [a, , b],或 [, protocol] = url.match /^(.*):\/\//
  • JSX 片段語法 現在已獲得支援。
  • 修正錯誤,在 /// 區塊正規表示式內的 # 行註解中,/// 會錯誤地關閉正規表示式,而不是視為註解的一部分。
  • 修正錯誤,陣列解構中的物件 rest 解構輸出不正確。

2.0.3

  • 修正錯誤,export default 後面接著一個隱含物件,其中包含一個明確物件,例如 exportedMember: { obj... }
  • 修正錯誤,在隱含物件成員之後的 key, val of obj,例如 foo: bar for key, val of obj
  • 修正錯誤,合併陣列和物件解構,例如 [ ..., {a, b} ] = arr
  • 修正錯誤,在邊緣情況下,有可能建立一個繫結 (=>) 產生器函式,這會擲回錯誤,因為 ES2015 不允許此類函式。
  • 修正錯誤,原始碼對應:.map 檔案應始終與要求的輸出檔案具有相同的基礎檔名。因此,coffee --map --output foo.js test.coffee 應產生 foo.jsfoo.js.map
  • 修正錯誤,在對多個輸入檔案使用 --transpile--map 時,產生的原始碼對應不正確。
  • 修正錯誤,在 REPL (coffee --interactive) 輸入的開頭或結尾處的註解。

2.0.2

  • --transpile 現在也適用於 requireimport 的 CoffeeScript 檔案。
  • --transpile 可與 REPL 一起使用:coffee --interactive --transpile
  • 改進註解輸出,現在應涵蓋所有 Flow 基於註解的語法。現在會在 變數 初始指派附近的內嵌 ### 註解輸出在變數宣告陳述式中,而 類別和方法名稱 附近的 ### 註解現在會輸出在 Flow 預期的位置。
  • 現在允許匯入 CoffeeScript 關鍵字,只要它們是別名:import { and as andFn } from 'lib'。(您也可以執行 import lib from 'lib',然後參考 lib.and。)
  • 當給予不帶括號的物件文字作為引數時,呼叫名稱為 getset 的函數不再會擲回錯誤:obj.set propertyName: propertyValue
  • 在衍生類別的建構函式中(一個 extends 另一個類別的類別),您無法使用參照 this 的引數來呼叫 superclass Child extends Parent then constructor: (@arg) -> super(@arg)。這在 JavaScript 中不被允許,現在 CoffeeScript 編譯器會擲回錯誤。相反地,在呼叫 super 之後指派給 this(arg) -> super(arg); @arg = arg
  • 修正當反引號陳述式和提升表達式同時出現在同一個類別主體時,輸出不正確的錯誤。這允許使用實驗性質的 類別欄位 語法的使用者在同一個類別中使用反引號行,例如 `field = 3`,而 CoffeeScript 會將其輸出為類別原型的一部分,例如 prop: 3
  • 修正複雜的 ? 運算之前未輸出的註解,例如 @a ? b
  • 現在所有測試在 Windows 中都能通過。

2.0.1

  • babel-core 不再列在 package.json 中,即使作為 optionalDependency,以避免它自動安裝在大部分使用者中。如果您希望使用 --transpile,只需手動安裝 babel-core。請參閱 轉譯
  • --transpile 現在依賴 Babel 來尋找其選項,亦即正在編譯的檔案路徑中的 .babelrc 檔案。(先前 CoffeeScript 編譯器重複了這個邏輯,所以從使用者的角度來看,並沒有任何改變。)這提供了自動支援,以便在未來的版本中使用其他方式將選項傳遞給 Babel,例如 Babel 7 中即將推出的 .babelrc.js 檔案。
  • 類別主體中反引號表示式,在任何類別方法之外,現在會輸出在 JavaScript 類別主體本身。這允許傳遞實驗性的 JavaScript 語法,例如 類別欄位建議,假設您的 轉譯器支援它

2.0.0

  • 新增 --transpile 旗標或 transpile Node API 選項,以指示 CoffeeScript 編譯器在儲存或傳回其輸出之前,透過 Babel 傳遞其輸出;請參閱 轉譯。同時也將 -t 簡短旗標變更為指向 --transpile,而不是 --tokens
  • 始終填入原始碼對應的 sourcesContent 屬性。
  • 修正解構和 JSX 中註解的錯誤。
  • 請注意,這些只是 2.0.0-beta5 和 2.0.0 之間的變更。請參閱下方自 1.x 以來的所有變更。

2.0.0-beta5

  • 現在支援 Node 6,我們將嘗試透過 coffee 指令或 Node API 將其維持為 CoffeeScript 2 所需的最低版本。較舊版本的 Node 或非長青瀏覽器,可以透過 舊版瀏覽器編譯器 編譯。
  • 命令列 --output 旗標現在允許您指定輸出檔名,而不仅仅是輸出資料夾。
  • 命令列 --require 旗標現在可以正確處理無效識別字的檔名或模組名稱(例如名稱中有連字號的 NPM 模組)。
  • Object.assign,在使用物件解構時輸出,會使用 Babel 輸出的相同 polyfill 進行 polyfill。這表示除非需要支援 Internet Explorer 8 或更早版本(或您的程式碼使用需要 polyfill 的功能),否則不應需要 polyfill。請參閱 ES2015+ 輸出
  • 僅包含註解的字串或 JSX 內插("a#{### comment ###}b"<div>{### comment ###}</div>)現在會輸出(`a${/* comment */}b`
  • 包含引號的內插字串(ES2015 範本字面)不再對引號進行跳脫:`say "${message}"`
  • 現在可以在函式字面後串接(例如,定義函式然後對其呼叫 .call)。
  • 執行 cake test 時,非同步測試的結果會包含在輸出中。
  • 修正物件解構的錯誤;函式參數中的展開;函式參數中產生的參考變數;do 之後的串接函式;陣列中存在運算子浸入後的展開([a?.b...]);陣列或函式參數中帶有展開的尾隨 if[a if b...]);嘗試 throw ifforswitchwhile 或其他無效結構。
  • 修正語法邊緣案例的錯誤:= 和其他「中表達式」代碼後的分號;:: 後的空格;以及以 :* 開頭的指令碼。
  • 修正透過 Node API 產生的原始碼對應;以及透過 Node API 從 .coffee 檔案編譯 CoffeeScript 時的堆疊追蹤行號。

2.0.0-beta4

  • 此版本包含 1.12.6 至 1.12.7 的所有變更
  • 行註解(以 # 開頭)現在會輸出在產生的 JavaScript 中。
  • 區塊註解(以 ### 區隔)現在可以在任何地方使用,包括以前無法使用的內聯位置。這提供了對使用 Flow 的基於註解語法的 靜態類型註解 的支援。
  • JSX 標籤中現在支援展開語法(物件的 ...):<div {props...} />
  • 透過 coffee 執行的指令碼的引數剖析已獲得改善。請參閱 重大變更
  • CLI:在分岔節點時傳播 SIGINTSIGTERM 訊號。
  • 現在 REPL 中的 await 不需要包裝函式也能使用。
  • 現在可以使用 do super,以及其他存取 super 的方式,例如 super.x.ysuper['x'].y
  • 現在可以在左側或右側使用 Splat/spread 語法三點 (因此 props......props 皆有效)。
  • 標籤範本字串被視為可呼叫函式。
  • 修正嵌套屬性中物件 spread 語法的錯誤。
  • 修正解構函式參數預設值的錯誤。

2.0.0-beta3

  • JSX 現在受到支援。
  • 物件 rest/spread 屬性 現在受到支援。
  • 在類別中再次支援繫結 (粗箭頭) 方法;不過,如果您嘗試在繫結方法之前呼叫它,會擲回錯誤。請參閱 類別的重大變更
  • REPL 不再會警告指派給 _
  • 修正解構嵌套預設值以及與跨多行鏈結或繼續表達式相關的問題。

2.0.0-beta2

  • 此版本包含 1.12.5 至 1.12.6 的所有變更
  • 類別中的繫結 (粗箭頭) 方法必須在類別建構函式中宣告,如果類別延伸父類別,則在 super() 之後。請參閱 類別的重大變更
  • 已移除所有不必要的公用程式輔助函式,包括 indexOfbind 的 polyfill。
  • extends 關鍵字現在僅在類別的語境中運作;無法用來延伸函式原型。請參閱 extends 的重大變更
  • Literate CoffeeScript 現在完全根據縮排進行剖析,類似於 1.x 實作;不再有剖析 Markdown 的依賴性。請參閱 Literate CoffeeScript 剖析的重大變更
  • 用作屬性的 JavaScript 保留字不再用引號包覆。
  • require('coffeescript') 現在應可在非 Node 環境中運作,例如 Webpack 或 Browserify 建立的建置。這提供了一個更便利的方式,將瀏覽器編譯器包含在打算在瀏覽器環境中執行的建置中。
  • throw 例外的 switch 情況後,不再新增無法到達的 break 陳述式。
  • 瀏覽器編譯器現在使用 Babili 編譯,並轉譯為 Babel 的 env 預設(應可安全地用於目前使用中的所有瀏覽器,不只長青版本)。
  • 呼叫函式 @get@set 不再會拋出關於所需括號的錯誤。(未附著於物件或 @ 的單獨 getset仍會故意拋出編譯器錯誤。)
  • 如果設定了 $XDG_CACHE_HOME,REPL .coffee_history 檔案會儲存在那裡。

2.0.0-beta1

  • CoffeeScript 2 的初始 beta 版本。不再預期有進一步的重大變更。
  • 解構的物件和陣列現在會盡可能使用 ES2015+ 語法輸出。
  • Literate CoffeeScript 現在有更好的 Markdown 剖析支援,這要歸功於使用 Markdown-It 來偵測 Markdown 區段,而不再只是查看縮排。
  • 呼叫名為 getset 的函式現在需要括號,以區分 getset 關鍵字(不允許)。
  • 編譯器現在需要 Node 7.6+,這是第一個支援非同步函式而不需要標記的 Node 版本。

2.0.0-alpha1

  • CoffeeScript 2 的初始 alpha 版本。CoffeeScript 編譯器現在會在可能的情況下輸出 ES2015+ 語法。請參閱 重大變更
  • 類別使用 ES2015 classextends 關鍵字輸出。
  • 新增對 async/await 的支援。
  • 繫結 (箭頭) 函式現在輸出為 => 函式。
  • 現在函式參數使用預設值會使用 ES2015 預設值語法。
  • 現在散列函式參數會使用 ES2015 散布語法。
  • 現在計算屬性使用 ES2015 語法。
  • 現在內插字串 (範本字串) 使用 ES2015 反引號語法。
  • 現在改善對識別 Literate CoffeeScript 檔案中 Markdown 的支援。
  • 現在禁止在縮排中混合使用 tab 和空白。
  • 現在使用 Google Closure Compiler (JavaScript 版本) 壓縮瀏覽器編譯器。
  • CoffeeScript 2 需要 Node 7+。

1.12.7

  • 修正 1.12.6 中與鏈結函式呼叫和縮排 returnthrow 參數相關的回歸。
  • REPL 不再會警告指派給 _

1.12.6

  • 現在 returnexport 關鍵字可以接受隱含物件 (由縮排定義,不需要大括號)。
  • 支援 Unicode 碼點跳脫 (例如 \u{1F4A9})。
  • 現在 coffee 指令會先查看 CoffeeScript 是否安裝在目前資料夾的 node_modules 中,如果有的話,就會執行那裡的 coffee 二進位檔;否則,就會執行全球安裝的那個。這讓您可以安裝一個 CoffeeScript 版本到全球,並為特定專案安裝另一個不同的版本。(cake 指令也是如此。)
  • 修正了鏈式函數呼叫未關閉隱式物件或三元運算子的錯誤。
  • 修正了三元運算子 if 陳述式中 ? 運算子產生的不正確程式碼錯誤。
  • 修正了一些測試,現在失敗的測試會產生非零的結束代碼。

1.12.5

  • importexport 陳述式中,更佳地處理 defaultfromas*。現在,您可以匯入或匯出一個名為 default 的成員,而編譯器不會將其解釋為 default 關鍵字。
  • 修正了一個錯誤,其中無效的八進制跳脫序列不會在編譯器中引發錯誤。

1.12.4

  • cake 命令已更新,其中大多數任務都新增了 watch 選項。複製 CoffeeScript 儲存庫,並在儲存庫的根目錄執行 cake 以查看選項。
  • 修正了一個錯誤,其中 export 參照變數會阻止宣告該變數。
  • 修正了一個錯誤,其中 coffee 命令無法用於 .litcoffee 檔案。
  • 修正了與代幣和位置資料相關的錯誤,以改善原始碼對應和提升與下游工具的相容性。

1.12.3

  • 現在可以在 for 運算式中將 @ 值用作索引。這放寬了 for 運算式的編譯,允許索引變數為 @ 值,例如 do @visit for @node, @index in nodes。在 @visit 內,目前節點的索引 (@node) 可用作 @index
  • 已還原 CoffeeScript 修補的 Error.prepareStackTrace,並進行了一些修改,應可防止錯誤的例外狀況,這些例外狀況讓一些下游專案難以執行。這修正了自 1.12.2 以來堆疊追蹤中不正確的行號。
  • //= 運算子的輸出現在會在右運算元周圍加上括號,就像其他指定運算子一樣。

1.12.2

  • 瀏覽器編譯器現在可以透過 MINIFY=false cake build:browser 再次建置成未壓縮的版本。
  • Error.prepareStackTrace 的容易出錯的修補版本已移除。
  • REPL 中的指令完成(按 Tab 取得建議)已修正,適用於 Node 6.9.1+。
  • 基於瀏覽器的測試 現在包含所有測試,如同基於 Node 的版本。

1.12.1

  • 您現在可以匯入名為 default 的模組成員,例如 import { default } from 'lib'。不過就像在 ES2015 中,您無法匯入整個模組並將其命名為 default(因此不允許 import default from 'lib')。
  • 修正回歸,其中 from 作為變數名稱會中斷 for 迴圈宣告。記錄上,from 在 CoffeeScript 中不是保留字;您可以將其用於變數名稱。fromimportexport 陳述式中,以及 for 迴圈的宣告中,會像關鍵字一樣運作;不過您也應該可以在這些內容中使用名為 from 的變數,而編譯器應該能夠分辨出差異。

1.12.0

  • CoffeeScript 現在支援 ES2015 標記範本字串。請注意,在您的程式碼中使用標記範本字串,會讓您有責任確保您的執行時間支援標記範本字串,或是您進一步將輸出的 JavaScript 轉譯成您的目標執行時間支援的版本。
  • CoffeeScript 現在提供 for…from 語法,用於輸出 ES2015 for…of。(很抱歉它們無法匹配,但我們首先想出 for…of 來做其他事。)這允許對產生器或任何其他可迭代物件進行反覆運算。請注意,在您的程式碼中使用 for…from 會讓您有責任確保您的執行時間支援 for…of,或者您進一步將輸出的 JavaScript 轉譯到您的目標執行時間支援的版本。
  • 三重反引號 ( ```​) 允許建立嵌入式 JavaScript 區塊,其中不需要跳脫單引號,這應改善與 ES2015 範本字串和 Markdown 的互通性。
  • 在單引號嵌入式 JavaScript 中,反引號現在可透過 \`​ 來跳脫。
  • 瀏覽器測試現在再次在瀏覽器中執行,如果您想測試您的瀏覽器,可 在此 存取。
  • ES2015 importexport 中僅限 CoffeeScript 的關鍵字現在會被忽略。
  • 編譯器現在會在嘗試匯出匿名類別時擲回錯誤。
  • 修正了與代幣和位置資料相關的錯誤,以改善原始碼對應和提升與下游工具的相容性。

1.11.1

  • 修正內插金鑰後簡寫物件語法的錯誤。
  • 修正 """ 字串中縮排移除的錯誤。
  • 修正無法將名稱「arguments」用於類別的原型屬性的錯誤。
  • 正確將大型十六進位數字字面值編譯為 2e308(就像所有其他大型數字字面值一樣)。

1.11.0

  • CoffeeScript 現在支援 ES2015 importexport 語法
  • -M, --inline-map 旗標新增到編譯器,讓您將原始碼對應表直接嵌入輸出 JavaScript 中,而不是作為一個獨立檔案。
  • 修正 yield 的一堆錯誤
    • yield return 不再可以錯誤地用作表達式。
    • yield 現在與 return 類似,它可以用作獨立運算式,也可以與表達式一起使用。在以前,您會寫 yield undefined,現在您可以簡單地寫 yield。但是,這也意味著繼承了 return 相同的語法限制,因此以下範例不再編譯
      doubles = ->
        yield for i in [1..3]
          i * 2
      six = ->
        yield
          2 * 3
      
    • JavaScript 輸出更漂亮,不再有 yield 周圍不必要的括號和空格、雙重縮排和雙重分號。
  • &&=||=and=or= 不再意外地允許等號前有空格。
  • 改善多個錯誤訊息。
  • 就像 undefined 編譯為 void 0NaN 現在編譯為 0/0Infinity 編譯為 2e308
  • 修復已重新命名且有預設值的解構參數的錯誤。({a: b = 1}) -> 不再會讓編譯器當機。
  • 改善 CoffeeScript 程式的內部表示方式。這只會影響使用 CoffeeScript.tokensCoffeeScript.nodes 的工具。這些工具需要更新,才能考量已變更或新增的代碼和節點。
  • 多個次要錯誤修復,包括
    • catch 區塊中捕獲的錯誤不再不必要地宣告,也不再錯誤地將沒有 catchtry 區塊命名為 undefined
    • 無法指定參數的解構不再會讓編譯器當機。
    • 來源地圖現在會正確用於從 .coffee.md 檔案拋出的錯誤。
    • coffee -e 'throw null' 不再會當機。
    • 使用 .exit 退出 REPL 時,REPL 不再會當機。
    • 在相同範圍內使用大量 for 迴圈時,不再會輸出無效的 JavaScript。
    • 使用 CLI 時,stdin 的 unicode 問題。

1.10.0

  • CoffeeScript 現在支援 ES2015 風格的解構預設值。
  • (offsetHeight: height) -> 不再編譯。該語法是意外的,且部分損壞。請改用 ({offsetHeight: height}) ->。物件解構始終需要大括號。
  • 多個次要錯誤修復,包括
    • REPL 有時會根據您先前輸入的內容將有效程式碼報告為無效的錯誤。
    • jest 測試架構中有多個 JS 內容的問題。
    • io.js 中嚴格模式設定在內部模組上的錯誤。
    • catch 區塊中已捕捉錯誤的變數名稱衝突。

1.9.3

  • 隱式呼叫中物件文字第一個鍵的內插程式碼的錯誤修正。
  • 修復 REPL 中損壞的錯誤訊息,以及 REPL 的一些小錯誤。
  • 使用 --bare 選項編譯時,修復行開頭記號的來源對應。這會產生較小的來源對應,帶來不錯的副作用。
  • 編譯區塊註解的格式略有改善。
  • onoffyesno 的錯誤訊息更佳。

1.9.2

  • 在編譯多個具有相同檔名的檔案時,修復 1.9.1 中引入的監控模式錯誤。
  • 修正包含 this 的運算式周圍的 yield
  • 在 REPL 中新增 Ruby 風格的 -r 選項,允許在使用 --eval--interactive 執行之前需要模組。
  • <script type="text/coffeescript"> 標籤中,為避免瀏覽器可能重複要求 .coffee 檔案,您現在可以使用 data-src 屬性,而非 src
  • IE8、嚴格的 ES5 正規表示式和 Browserify 的小錯誤修正。

1.9.1

  • 內插程式碼現在可在物件文字鍵中運作(再次)。您可以使用它動態命名屬性。
  • 內部編譯器變數名稱不再以底線開頭。這讓產生的 JavaScript 變得更漂亮,也修正了 AngularJS「剖析」函數參數時完全錯誤且不敬虔的方式所造成的問題。
  • 修正了幾個與 yield 相關的邊緣狀況,包括 yield returnyield throw
  • 針對編譯器錯誤訊息進行輕微的錯誤修正和各種改進。

1.9.0

  • CoffeeScript 現在支援 ES2015 產生器。產生器只是一個 yield 的函數。
  • 針對字串和正規表示式進行更穩健的剖析和改進錯誤訊息,特別是關於內插。
  • 變更內部編譯器變數名稱的產生策略。請注意,這表示 @example 函數參數不再可以在函數主體中作為裸露的 example 變數使用。
  • 修正 REPL 與最新版本的 Node 和 Io.js 的相容性。
  • 進行各種輕微的錯誤修正。

1.8.0

  • CLI 的 --join 選項現已過時。
  • 來源對應現在使用 .js.map 作為檔案副檔名,而不是僅使用 .map
  • 當 CLI 無法將檔案寫入磁碟時,現在會以結束程式碼 1 結束。
  • 編譯器不再會在未終止的單引號字串中崩潰。
  • 修正字串內插的位置資料,這讓來源對應不同步。
  • 如果程式碼以 tab 縮排,錯誤訊息中的錯誤標記現在會正確定位。
  • 修正 CoffeeScript 來源對應修補堆疊追蹤中輕微的格式化錯誤。
  • %% 算子現在只強制轉換其右運算元一次。
  • 現在可以在不先註冊編譯器的情況下,從 Cakefiles 中需要 CoffeeScript 檔案。
  • CoffeeScript REPL 現在已匯出,可以使用 require 'coffeescript/repl' 需要。
  • 修正 Node 0.11 中的 REPL。

1.7.1

  • 修正一個錯字,這個錯字會在使用 coffee 二進位檔案直接執行腳本時中斷節點模組查詢。

1.7.0

  • 現在在 Node 中需要 CoffeeScript 檔案時,您必須明確註冊編譯器。這可以使用 require 'coffeescript/register'CoffeeScript.register() 來完成。對於諸如 Mocha 的組態,也請使用 coffeescript/register
  • 改進錯誤訊息、來源對應和堆疊追蹤。來源對應現在使用更新的 //# 語法。
  • 現在,前導 . 會關閉所有開啟的呼叫,允許使用更簡潔的鏈結語法。
  • 新增 **//%% 算子,以及參數清單和解構表達式中的 ... 展開。
  • 多行字串現在以單一空白連接,並忽略所有縮排。字串和 heredocs 中,行尾的反斜線可以表示行間的空白量。反斜線可以在區塊正規表示式中正確跳脫空白。
  • 現在可以縮排閉合括號,因此不再會導致意外的錯誤。
  • 數個會中斷編譯的修正。不可呼叫的文字(字串、數字等)現在不會在呼叫中編譯,而且多個後置條件式會正確編譯。後置條件式和迴圈總是會繫結物件文字。條件式指派會在子表達式中正確編譯。super 在方法外不允許使用,而且在 for 迴圈中會正確運作。
  • 已改善編譯區塊註解的格式化。
  • Windows 上不再有 -p 資料夾。
  • 傳遞給 CoffeeScript 的 options 物件不再會被變異。

1.6.3

  • CoffeeScript REPL 現在會在不同工作階段之間記住您的歷史記錄。就像一個適當的 REPL 應該做的那樣。
  • 現在可以在 Node 中使用 require 來載入 .coffee.md Literate CoffeeScript 檔案。在瀏覽器中,使用 text/literate-coffeescript script 標籤。
  • 舊的 coffee --lint 指令已移除。它在最初開發編譯器時很有用,但已被 JSHint 取代。現在可以使用 -l 透過 stdio 傳遞 literate 檔案。
  • 修正 Windows 路徑分隔符號、未命名錯誤的 catch,以及可執行類別主體與原型屬性附加的錯誤。

1.6.2

  • 執行 CoffeeScript 直接透過 coffee 指令,以及執行 CoffeeScript 直接在瀏覽器中時,原始碼對應表已被用於提供自動列對應。此外,用於提供編譯器拋出的語意錯誤的更佳錯誤訊息 — 甚至有顏色
  • 改善對混合文字/香草樣式 CoffeeScript 專案的支援,並同時為兩者產生原始碼對應表。
  • 修正 1.6.x 回歸,包括覆寫繼承綁定函式,以及 Windows 檔案路徑管理。
  • coffee 指令現在可以正確 fork() .coffee.js 檔案。(需要 Node.js 0.9+)

1.6.1

  • 原始碼對應表 的第一個版本。將 --map 旗標傳遞給編譯器,然後開始吧。將你的所有謝意傳達給 Jason Walton
  • 修正 1.5.0 回歸,包括針對縮排隱式物件的多次隱式呼叫。隱式函式呼叫和隱式物件的組合現在通常應該會解析得更好 — 但將它們過度巢狀仍然不是好的樣式
  • .coffee.md 現在也支援為現有工具的文字 CoffeeScript 檔案副檔名。.litcoffee 仍然是標準的。
  • 圍繞成員屬性、綁定方法和類別宣告中的 super 的多項小修正。

1.5.0

  • 文字 CoffeeScript 的第一個版本。
  • CoffeeScript REPL 現在以 Node.js REPL 為基礎,並且應該可以更順利、更熟悉地運作。
  • 現在禁止從建構函式傳回明確值。如果你想要傳回任意值,請使用函式,而不是建構函式。
  • 現在你可以反向迴圈陣列,而不需要手動處理索引:for item in list by -1
  • 原始碼位置現在會保留在 CoffeeScript AST 中,儘管尚未發射原始碼對應表。

1.4.0

  • CoffeeScript 編譯器現在會移除 Microsoft 的 UTF-8 BOM(如果存在),讓你能夠編譯 BOM 損壞的原始碼檔案。
  • 透過移除 registerExtension,並從 path.exists 移至 fs.exists,修正 Node/編譯器不建議使用的警告。
  • 對 splat 編譯、反引號、切片,以及物件文字中重複鍵的錯誤進行小幅調整。

1.3.3

  • 由於 JavaScript 嚴格模式的新語意,CoffeeScript 不再保證建構函式在所有執行時間中都有名稱。請參閱 #2052 進行討論。
  • 現在可以在實例方法內的巢狀函式內更可靠地呼叫 super(遞迴向上移動)。
  • 命名迴圈變數不再具有與其他局部變數不同的範圍啟發法。(還原 #643)
  • 修正嵌套在解構賦值 LHS 內的 splat。
  • 修正編譯時間嚴格模式禁止八進位文字的錯誤。

1.3.1

  • CoffeeScript 現在在編譯時強制執行所有 JavaScript 的嚴格模式早期語法錯誤。這包括舊式八進位文字、物件文字中重複的屬性名稱、函式定義中重複的參數、刪除裸變數、設定 evalarguments 的值,以及更多。請參閱 #1547 的完整討論。
  • REPL 現在有一個方便的新多行模式,可用於輸入大型程式碼區塊。在將範例複製並貼上到 REPL 時很有用。使用 Ctrl-V 進入多行模式。您現在也可以將輸入直接傳遞到 REPL。
  • CoffeeScript 現在會在每個編譯檔案的頂端列印 由 CoffeeScript VERSION 產生 標頭。
  • 先前未定義變數的條件式賦值 a or= b 現在被視為語法錯誤。
  • 調整 do 的語意,現在可以用來更輕易地模擬命名空間:do (x = 1, y = 2) -> …
  • 迴圈索引現在可以在迴圈迭代中變動,在迴圈迭代之間則不能變動。
  • 為了保持一致性,現在允許省略切片的兩個端點,實際上會建立清單的淺層拷貝。
  • 在 Node 的「新」檔案監控 API 下,對 coffee --watch 進行額外的調整和改進。現在,如果在監控的指令碼中引入語法錯誤,監控會預設發出嗶聲。現在,在遞迴監控時,我們也會預設忽略隱藏目錄。

1.2.0

  • coffee --watch--join 進行多項改進。現在,您可以同時使用這兩個指令,也可以在 --watch 的資料夾中新增和移除檔案和目錄。
  • 現在可以使用 throw 陳述式作為表達式的一部分。
  • 檔案頂端的區塊註解現在會顯示在安全封閉包裝之外。
  • 修正了多個 1.1.3 的次要回歸,這些回歸與尾隨運算子、未完成的行有關,以及一個較重大的 1.1.3 回歸,導致繫結類別函式的繫結函式具有不正確的 this

1.1.3

  • 啊,空白。CoffeeScript 編譯的 JS 現在會試著將各個部分隔開並保持可讀性,如您可以在此頁面的範例中看到。
  • 現在可以在類別主體中的類別層級方法中呼叫 super,繫結類別方法現在會保留其正確的內容。
  • JavaScript 一直支援八進位數字 010 是 8 和十六進位數字 0xf 是 15,但 CoffeeScript 現在也支援二進位數字:0b10 是 2
  • CoffeeScript 模組已巢狀在一個子目錄下,讓您可以更輕鬆地個別 require 各個元件,而不需要使用 npm。例如,將 CoffeeScript 資料夾加入您的路徑後:require('coffeescript/lexer')
  • 此網頁上的「試用 CoffeeScript」新增了「連結」功能。使用此功能可為您的範例指令碼取得可分享的永久連結。
  • coffee --watch 功能現在僅適用於 Node.js 0.6.0 以上版本,但現在也能在 Windows 上正常運作。
  • @michaelficarra@geraldalewis@satyr@trevorburnham 修復了許多小錯誤。

1.1.2

修正了區塊註解格式、?= 編譯、對控制結構的隱式呼叫、try/catch 區塊的隱式呼叫、從區域範圍外洩的變數參數、heregexes 之後語法錯誤的行號、括號數字文字的屬性存取、具有保留名稱的繫結類別方法和 super、REPL 大修、連續編譯的分號、隱式呼叫物件中的區塊註解,以及 Chrome 錯誤。

1.1.1

針對具有外部建構函式的類別發布錯誤修正版本,請參閱問題 #1182。

1.1.0

當透過 coffee 可執行檔執行時,process.argv 和相關函數現在會回報 coffee,而非 node。提升與 Node.js 0.4.x 模組查詢變更的相容性。REPL 中的輸出現在會上色,就像 Node 的一樣。在使用 --join 時,現在必須為串接的 CoffeeScript 命名。修正錯誤,將複合除法 /= 意外解譯為正規表示式。所有 text/coffeescript 標籤現在都應該按照包含順序執行。修正使用外部建構函式的擴充子類別所產生的問題。修正 addImplicitParentheses 中的臨界無限迴圈。修正函式呼叫長鏈所產生的指數緩慢。全域變數不再外洩到 CoffeeScript REPL。散列參數宣告為函式內部變數。

1.0.1

修正 Unicode 識別碼的詞法分析器錯誤。更新 REPL 以相容於 Node.js 0.3.7。修正在 REPL 中需要相對路徑。尾隨的 returnreturn undefined 現在已最佳化。不再需要核心 Node.js util 模組,以維持與 Node.js 0.2.5 的向下相容性。修正條件式 return 會導致 switch 陳述式穿透的問題。最佳化解構賦值中的空物件。

1.0.0

CoffeeScript 迴圈在迴圈主體中產生函式時,不再嘗試保留區塊範圍。相反地,您可以使用 do 關鍵字建立方便的封閉包裝器。新增 --nodejs 旗標,用於將選項直接傳遞給 node 可執行檔。改善表達式中純粹陳述式的使用行為。修正所有瀏覽器的包含式切片至 -1,以及使用任意表達式作為終點進行拼接。

0.9.6

REPL 現在正確格式化堆疊追蹤,並在非同步例外狀況中保持運作。使用 --watch 現在會在編譯檔案時印出時間戳記。修正了在拔除的閉包迴圈中意外洩漏變數的問題。建構函式現在會在類別主體中維護其宣告位置。已移除動態物件金鑰。現在支援巢狀類別。修正了裸 splatted 函式的執行內容。修正了連鎖比較的反轉錯誤。連鎖類別實體化現在可以正確地與 splats 一起使用。

0.9.5

0.9.5 應被視為 CoffeeScript 1.0 的第一個候選版本。自前一個版本以來已經有許多內部變更,許多來自 satyrCoco CoffeeScript 方言。已新增 Heregexes(擴充正規表示式)。函式現在可以有預設引數。類別主體現在是可執行程式碼。改善了無效 CoffeeScript 的語法錯誤。undefined 現在像 null 一樣運作,且無法指定新值。單行理解在優先順序上有所變更:result = i for i in list 以前預設會分析為 result = (i for i in list) … 現在會分析為 (result = i) for i in list

0.9.4

CoffeeScript 現在使用適當命名的暫時變數,並在使用後回收其參照。已新增 require.extensions 支援 Node.js 0.3。現在在瀏覽器中載入 CoffeeScript 只會在全域範圍中新增一個 CoffeeScript 物件。修正了隱含物件和區塊註解的邊界狀況。

0.9.3

CoffeeScript switch 陳述式現在會編譯成 JS switch 陳述式 — 它們以前會編譯成 if/else 鏈以相容 JavaScript 1.3。現在支援浸潤函式呼叫。RubyMine 編輯器的使用者現在應該可以使用 --watch 模式。

0.9.2

現在可以選擇性地指定範圍文字的開始和結束,例如 array[3..]。現在您可以說 a not instanceof b。修正了嵌套顯著和不顯著縮排的重要錯誤(問題 #637)。新增一個 --require 旗標,讓您可以連結到 coffee 指令。新增一個自訂的 jsl.conf 檔案,供我們偏好的 JavaScriptLint 設定使用。透過扁平化運算規則,加快了 Jison 語法編譯時間。區塊註解現在可以使用 JavaScript 壓縮器友善的語法。新增 JavaScript 的複合賦值位元運算子。修正了隱式物件文字的錯誤,這些文字具有前導數字和字串鍵,作為隱式呼叫的主旨,以及作為複合賦值的一部分。

0.9.1

0.9.1 的錯誤修正版本。大幅改善了混合隱式物件、隱式函式呼叫和隱式縮排的處理方式。字串和正規表示式內插現在嚴格為 #{ … }(Ruby 風格)。編譯器現在會採用 --require 旗標,此旗標會指定在編譯之前執行的指令碼。

0.9.0

CoffeeScript 0.9 系列被視為 1.0 的候選版本;讓我們來試用看看。0.9.0 引進一個巨大的向下不相容的變更:現在指派使用 =,而物件文字則使用 :,就像 JavaScript 一樣。這讓我們可以有隱含的物件文字,以及 YAML 風格的物件定義。半指派已被移除,取而代之的是 +=or=,以及其他類似的寫法。插值現在使用井號 # 而不是美元符號 $ — 因為美元符號可能是有效的 JS 識別碼的一部分。向下範圍運算式現在又安全了,而且在使用整數端點建立時會最佳化為直線迴圈。新增了一種快速、未受保護的物件運算式:for all key, value of object。現在不帶參數提到 super 關鍵字會轉送傳遞給函式的全部參數,就像 Ruby 一樣。如果你從父類別 A 延伸類別 B,如果 A 定義了一個 extended 方法,它會被呼叫,並傳入 B — 這會啟用靜態繼承,以及其他功能。使用胖箭頭繫結的函式會產生更簡潔的輸出。@variables 現在可以在參數清單中使用,參數會自動設定為物件上的屬性 — 這在建構函式和設定函式中很有用。建構函式現在可以接受散列。

0.7.2

快速修正錯誤(緊接在 0.7.1 之後),解決在某些情況下無法解析 coffee 命令列選項的問題。

0.7.1

區塊風格註解現在會傳遞並列印為 JavaScript 區塊註解 – 讓它們對於授權和版權標題很有用。透過 hashbangs 獨立執行 coffee 腳本的支援度更好。改善語法錯誤,針對不在語法中的代碼。

0.7.0

官方 CoffeeScript 變數樣式現在為 camelCase,如同 JavaScript。保留字現在允許作為物件金鑰,並會為您加上引號。範圍理解現在會產生更簡潔的程式碼,但如果您想向下反覆運算,必須指定 by -1。語法錯誤的回報已大幅改善,優於前一個版本。現在執行 coffee 而沒有參數會啟動 REPL,並支援 Readline。<- 繫結運算子已從 CoffeeScript 中移除。新增了 loop 關鍵字,等同於 while true 迴圈。包含封閉的理解現在會封閉在它們的變數中,如同 forEach 的語意。您現在可以在類別定義中使用繫結函數(繫結至實例)。為了保持一致性,a in b 現在是陣列存在檢查,而 a of b 是物件金鑰檢查。註解不再傳遞至產生的 JavaScript。

0.6.2

編譯滿是腳本的目錄時,coffee 指令現在會保留目錄結構。修正了兩個遺漏,這些遺漏會阻止 CoffeeScript 編譯器在 Internet Explorer 中執行。現在有一個區塊註解的語法,其精神類似於 CoffeeScript 的 here 文件。現在支援 ECMA Harmony DRY 風格的模式比對,其中屬性的名稱與值的相同:{name, length}: func。現在允許在理解變數中進行模式比對。現在允許 unless 出現在區塊形式中。新增了 until 迴圈,作為 while 迴圈的反向。現在允許 switch 陳述式沒有 switch 物件子句。相容於 Node.js v0.1.95

0.6.1

升級 CoffeeScript 以與新的 Node.js v0.1.90 系列相容。

0.6.0

現在允許尾隨逗號,如同 Python。靜態屬性可以使用 @property 符號直接指定在類別定義中。

0.5.6

插值現在可以使用在正規表示式和 heredocs,以及字串中。增加了 <- 繫結運算子。允許指定半表達式,而不是特殊的 ||= 風格運算子。引數物件不再自動轉換成陣列。需要 coffeescript 之後,Node.js 現在可以透過 registerExtension 直接載入 .coffee 檔案。現在可以在函式呼叫、陣列和模式比對中使用多個散列。

0.5.5

字串插值,由 Stan Angeloff 貢獻。由於 --run0.5.3 以來一直是預設值,更新 --stdio--eval 以預設執行,如果你想列印結果,也傳遞 --compile

0.5.4

修正錯誤,更正 Node.js 全域常數 __filename__dirname。調整以更靈活地剖析巢狀函式文字和縮排不當的註解。更新為最新的 Node.js API。

0.5.3

CoffeeScript 現在有定義類別的語法。許多核心元件(節點、詞法分析器、重寫器、範圍、Optparse)都在使用它們。Cakefiles 可以使用 optparse.coffee 為任務定義選項。--run 現在是 coffee 指令的預設旗標,使用 --compile 來儲存 JavaScripts。修正 RegExp 文字和鏈結除法之間的歧義。

0.5.2

新增壓縮版本的編譯器,包含在網頁中,為 /v2/browser-compiler-legacy/coffeescript.js。它會自動為你執行任何類型為 text/coffeescript 的腳本標籤。新增 --stdio 選項到 coffee 指令,用於管線編譯。

0.5.1

改進存在運算子的 null 浸潤,包括對索引屬性的浸潤。新增條件到 while 迴圈,因此你可以將它們用作具有 when 的篩選器,就像理解一樣。

0.5.0

CoffeeScript 0.5.0 是個重大版本,雖然沒有語言上的變更,但 Ruby 編譯器已被移除,取而代之的是用純 CoffeeScript 編寫的自寄存編譯器。

0.3.2

@property 現在是 this.property 的簡寫。將預設 JavaScript 引擎從 Narwhal 切換到 Node.js。如果你想要繼續使用它,請傳遞 --narwhal 旗標。

0.3.0

CoffeeScript 0.3 包含重大的語法變更:函式符號已變更為 ->,而繫結函式符號現在是 =>。函式定義中的參數清單現在必須用括號包住。新增屬性滲透,使用 ?. 算子。在用參數呼叫函式時,讓括號變成可選。移除過時的區塊文字語法。

0.2.6

新增 Python 風格的鏈式比較、條件存在算子 ?=,以及一些來自《優美的程式碼》的範例。修正與陳述式轉換為表達式、參數轉換為陣列,以及 TextMate 語法高亮顯示器相關的錯誤。

0.2.5

switch 陳述式中的條件現在可以一次取用多個值 — 如果其中任何一個為真,則會執行 case。新增長箭號 ==>,用來定義函式並立即將其繫結到 this。while 迴圈現在可以用作表達式,就像理解一樣。散列可以在模式比對中用來吸收陣列的其餘部分。

0.2.4

新增 ECMAScript Harmony 風格的解構賦值,用來處理從巢狀陣列和物件中萃取值。新增對縮排敏感的 here-doc,用來處理格式良好的字串或程式碼區塊。

0.2.3

捨棄令人不滿意的 ino 關鍵字,用 of 取代它來處理物件理解。它們現在看起來像:for prop, value of object

0.2.2

在執行物件的理解時,請使用 ino,而非 in,這有助於我們在編譯時產生更小、更有效率的程式碼。新增 :: 作為表示 .prototype. 的簡寫。將「splat」符號從前置星號 * 變更為後置省略號 ...。新增 JavaScript 的 in 算子、空的 return 陳述式,以及空的 while 迴圈。現在,以大寫字母開頭的建構函式包含一個安全檢查,以確保傳回物件的新執行個體。extends 關鍵字現在與 Google 的 Closure Library 中的 goog.inherits 的功能相同。

0.2.1

參數物件現在在參照時會轉換成真正的陣列。

0.2.0

重大版本。顯著的空白。更好的陳述式轉換為表達式。Splat。Splice 文字。物件理解。區塊。存在運算子。非常感謝所有張貼問題的人,特別感謝 Liam O’Connor-Davis 提供空白和表達式協助。

0.1.6

修正從 CoffeeScript 目錄外部執行 coffee --interactive--run 的錯誤。修正巢狀函式/if 陳述式的錯誤。

0.1.5

陣列切片文字和陣列理解現在都可以採用 Ruby 風格的範圍來指定開始和結束。JavaScript 變數宣告現在會推送到範圍的最上方,讓所有指定陳述式都變成表達式。您可以使用 \ 來跳脫換行。coffeescript 指令現在稱為 coffee

0.1.4

官方 CoffeeScript 副檔名現在是 .coffee,而非 .cs,後者正確來說屬於 C#。由於廣受歡迎,您現在也可以使用 = 來指定。與 JavaScript 不同,= 也可以用在物件文字中,與 : 可以互換。針對鏈結函式呼叫(例如 func(1)(2)(3)(4))進行語法修正。繼承和 super 不再使用 __proto__,因此現在應該與 IE 相容。

0.1.3

coffee 指令現在包含 --interactive,它會啟動一個互動式的 CoffeeScript 會話,以及 --run,它會直接編譯並執行一個腳本。這兩個選項都依賴於 Narwhal 的正常安裝。aint 關鍵字已被 isnt 取代,它與 is 搭配起來更順暢。引號字串現在可以在物件文字中作為識別符號:例如 {"5+5": 10}。所有賦值運算子現在都使用冒號:+:-:*: 等。

0.1.2

修正透過多個層級的繼承呼叫 super() 的錯誤,並重新加入 extends 關鍵字。新增實驗性的 Narwhal 支援(作為 Tusk 套件),由 Tom Robinson 貢獻,包括 bin/cs 作為 CoffeeScript REPL 和解釋器。新的 --no-wrap 選項用於抑制安全函式包裝器。

0.1.1

新增 instanceoftypeof 作為運算子。

0.1.0

初始的 CoffeeScript 發行版。