原文:http://gkz.github.com/LiveScript/blog/ten-reasons-to-switch-from-coffeescript.html
CoffeeScript 問世已經有一段時間了,現在已經被很多開發者們使用,不少工具也依賴它.
那么為什么我們還要從CoffeeScript轉移到它的分支,LiveScript呢?這里有10個原因:
-
提高可讀性
LiveScript支持在標識符中使用連字符,編譯時可以把帶連字符的標識符轉換成駝峰形式,保持與JavaScript代碼風格的統一.
document.query-selector-all
會被編譯為
document.querySelectorAll
數字直接量的話,還支持下划線分割和附帶后綴單位:
64_000km
會被編譯為
64000
-
|>
管道運算符這是從F#學來的語法,
val |> func
相當於func(val)
.在連接多個科里化的函數時非常有用[1 2 3] |> map (* 2) |> sum #=> 12
-
標准庫
prelude.ls - 基於Haskell的Prelude模塊,提供了很多操作數組的函數,配合管道運算符效果更好.
-
部分應用運算符和成員訪問
這樣可以寫出純粹的函數式代碼且不需要模板:
people |> map (.name) |> filter (invisitors)
相當於
people.map((man) -> man.name).filter((name) -> nameinvisitors)
-
常量
const x = 10
會在編譯時禁止常量的重新賦值,這樣會有更少的錯誤.類似於ES6中的
const
,但最終會編譯成var
,因為目前還有不少引擎不支持const
. -
改進變量作用域
=
總是會在當前作用域內新建一個局部變量,使用:=
才是給外層作用域的變量重新賦值,這樣可以減少bug.x = 1
y = 1
do ->
x = 2 #新建一個局部變量x
y := 2 #修改外部函數的變量y
x #=> 1
y #=> 2 -
改進運算符關聯性
unique pulls .length
會優先運行
unique
函數,然后在返回的結果上獲取length
屬性,而在CoffeeScript,必須明確的添加括號:unique(pulls).length
多個表達式連接起來也不需要小括號
unique node or not empty node
會編譯為
unique(node) || !empty(node)
-
真正的, ECMAScript 6 / Python / Haskell風格的列表推導式
[x ** y for x in [10, 20] for y in [2, 3]]
會產生一個數組
[100, 1000, 400, 8000]
譯者注:ES6中,把這種語法稱之為數組推導式( Array Comprehension ),Firefox已經支持該語法,寫法是這樣的:
[Math.pow(x,y) for(x of [10, 20]) for(y of [2, 3])]
這應該才是ES6的正確語法
-
科里化函數
(a, b, c) --> a * b * c
代替了
(a) -> (b) -> (c) -> a * b * c
用法是這樣的
times = (x, y) --> x * y times 2, 3 #=> 6 (參數足夠時是一個普通的函數,返回計算后的結果) double = times 2 #參數不夠時,會返回一個部分應用函數.相當於JavaScript中的double = times.bind(null,2)
double 5 #=> 10 (相當於times 2 5) -
更多語法
扁平化的異步回調語法:
error <- fs.write-file path, data
alert error等同於
fs.writeFile(path, data,function(error){alert(error)});
單詞數組:
<[one two three]>
等同於
['one', 'two', 'three']
如果你已經寫過一些CoffeeScript代碼了,那么這里有一個轉換指南.
如果你打算用LiveScript寫一個web應用程序,我推薦你看一下Brunch,它支持LiveScript.
對函數式編程感興趣?那可以看看Functional Programming in JavaScript using LiveScript and prelude.ls.