[译]从CoffeeScript转到LiveScript的10个理由

原文:http://gkz.github.com/LiveScript/blog/ten-reasons-to-switch-from-coffeescript.html


CoffeeScript 问世已经有一段时间了,现在已经被很多开发者们使用,不少工具也依赖它.

那么为什么我们还要从CoffeeScript转移到它的分支,LiveScript呢?这里有10个原因:

  1. 提高可读性

    LiveScript支持在标识符中使用连字符,编译时可以把带连字符的标识符转换成驼峰形式,保持与JavaScript代码风格的统一.

    document.query-selector-all

    会被编译为

    document.querySelectorAll

    数字直接量的话,还支持下划线分割和附带后缀单位:

    64_000km

    会被编译为

    64000
  2. |> 管道运算符

    这是从F#学来的语法,val |> func 相当于 func(val).在连接多个科里化的函数时非常有用

    [1 2 3] |> map (* 2) |> sum #=> 12
  3. 标准库

    prelude.ls - 基于Haskell的Prelude模块,提供了很多操作数组的函数,配合管道运算符效果更好.

  4. 部分应用运算符和成员访问

    这样可以写出纯粹的函数式代码且不需要模板:

    people |> map (.name) |> filter (invisitors)

    相当于

    people.map((man) -> man.name).filter((name) -> nameinvisitors)
  5. 常量

    const x = 10

    会在编译时禁止常量的重新赋值,这样会有更少的错误.类似于ES6中的const,但最终会编译成var,因为目前还有不少引擎不支持const.

  6. 改进变量作用域

    = 总是会在当前作用域内新建一个局部变量,使用 := 才是给外层作用域的变量重新赋值,这样可以减少bug.

    x = 1
    y = 1
    do ->
    x = 2 #新建一个局部变量x
    y := 2 #修改外部函数的变量y
    x #=> 1
    y #=> 2
  7. 改进运算符关联性

    unique pulls .length

    会优先运行unique函数,然后在返回的结果上获取length属性,而在CoffeeScript,必须明确的添加括号:

    unique(pulls).length

    多个表达式连接起来也不需要小括号

    unique node or not empty node

    会编译为

    unique(node) || !empty(node)
  8. 真正的, 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的正确语法

  9. 科里化函数

    (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)
  10. 更多语法

    扁平化的异步回调语法:

    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.

posted @ 2012-10-04 19:24  紫云飞  阅读(5270)  评论(2编辑  收藏  举报