从 CoffeeScript 迁移到 LiveScript 的 10 个理由

2012年7月5日 - Paul Miller

以下是由 Paul Miller 发布的客座文章。您也可以提交客座文章,只需发送一个 pull request 即可。

CoffeeScript 已经存在了一段时间,现在被许多开发者和工具使用。

但是,为什么有人要从 CoffeeScript 切换到它的分支 LiveScript 呢?以下列出了十个理由

  1. 可读性改进

    LiveScript 支持标识符中的连字符,并将其转换为驼峰式命名法,以保持与 JavaScript 代码风格的一致性。

    document.query-selector-all

    等价于,并且会编译成

    document.querySelectorAll

    对于数字,它们支持下划线和后缀

    64_000km

    将简单地编译成

    64000
  2. |> 管道操作符

    它与函数而不是原型上的方法一起使用,这使得可以轻松地为链编写自己的模块化函数。例如

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

    prelude.ls - 基于 Haskell 的 Prelude 模块。ECMAScript 5 数组扩展很好,但还不够。与管道操作符配合使用效果极佳。

  4. 部分应用操作符和成员访问

    这允许编写无样板代码的纯函数式代码

    people |> map (.name) |> filter (in visitors)

    而不是

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

    const x = 10

    它们在编译时进行检查,以减少错误。工作方式类似于 ES6 的 const,但它编译成 var,因为 const 目前还没有得到引擎的大力支持。

  6. 作用域改进

    = 始终在当前作用域中声明变量,使用 := 重新声明外部作用域变量,从而减少 bug。

    x = 1
    y = 1
    do ->
      x = 2
      y := 2
    x #=> 1
    y #=> 2
    
  7. 操作符结合性改进

    unique pulls .length

    将执行 unique,然后获取结果的 .length 属性,这与 CoffeeScript 不同,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]

    正如预期的那样。

  9. 柯里化函数

    (a, b, c) --> a * b * c

    而不是

    (a) -> (b) -> (c) -> a * b * c

    对函数式缓存非常有用。

  10. 新的习语

    异步回调扁平化语法

    error <- fs.write-file path, data
    alert error
    

    “单词数组” Ruby 习语

    <[one two three]>

    对比

    ['one', 'two', 'three']

如果您已经编写了一些 CoffeeScript 代码,则可以参考 转换指南

如果您决定使用 LiveScript 编写 Web 应用程序,我建议您查看 Brunch,它“只需运行”并干净地支持 LiveScript。

对函数式编程感兴趣?查看 使用 LiveScript 和 prelude.ls 进行 JavaScript 函数式编程


有关 LiveScript 和 prelude.ls 的更多信息,

Disqus 提供支持的评论