[译]从CoffeeScript转到LiveScript的10个理由
原文: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.