Nodejs下LiveScript和CoffeeScript的比较

Nodejs下LiveScript和CoffeeScript的比较

LiveScript比CoffeeScript好的地方:

  • [ x to y ][ x til y], 比 [ x .. y ][ x ... y ]清楚多了。for i from x to yfor i from x til y同理。
  • 默认情况下变量赋值不会污染外层的变量,再也不用do ( x = undefined, y = undefined, ...) ->了。如果需要修改外层变量的值,则使用:=
  • const定义常量,类似于ES6中的const,但是最终会编译成var,兼容不支持const的引擎。
  • do换成了let,更明白清晰。
  • require可以写得更短:require! lib代替lib = require 'lib'
  • 各种函数式编程的语法糖,(+ 2) 4times = (x, y) --> x * y; double = times 2, [1 2 3] |> map (* 2) |> sum等等。

LiveScript的问题:

  • 有些语法不太好记,JavaScript里的=====已经让人迷惑了,LiveScript里则是~======。LiveScript里,以下值为true 1 ~= '1'[1, 2, 3] === [1, 2, 3],但是`[1, 2, 3] ~= '[1, 2, 3]'是false。

  • sourcemap支持还没有。后端开发的话,直接lsc运行,问题不大,但是前端在浏览器里调试就痛苦了。

  • 语法吸收了很多Haskell,让人忍不住想用函数式的写法,但是并没有尾递归优化等支持。


via my blog


5 回复

Node.js 下 LiveScript 和 CoffeeScript 的比较

LiveScript 比 CoffeeScript 好的地方

LiveScript 和 CoffeeScript 都是 JavaScript 的超集,它们的目标都是简化代码编写并提高可读性。但在某些方面,LiveScript 提供了一些独特的优势。

  1. 范围和循环语法更清晰

    • 在 LiveScript 中,你可以使用 [ x to y ][ x til y] 来表示闭区间和开区间,这比 CoffeeScript 的 [ x .. y ][ x ... y ] 更直观。
    // LiveScript 示例
    for i from 1 to 5
      console.log i
    
  2. 变量作用域管理

    • LiveScript 默认情况下不会污染外层的变量。如果你需要修改外层变量,可以使用 := 操作符。
    // LiveScript 示例
    do
      x := 10
    console.log x  // 输出: 10
    
  3. 常量定义

    • LiveScript 提供了 const 关键字来定义常量,类似于 ES6 中的 const,但最终会被编译成 var,以保持兼容性。
    // LiveScript 示例
    const PI = 3.14
    
  4. 简洁的模块导入

    • LiveScript 允许你用更简洁的方式导入模块,如 require! lib 替代 lib = require 'lib'
    // LiveScript 示例
    myLib = require! 'my-lib'
    
  5. 函数式编程的语法糖

    • LiveScript 提供了许多函数式编程的语法糖,使代码更加简洁。
    // LiveScript 示例
    double = (+ 2)
    console.log double(4)  // 输出: 6
    
    times = (x, y) -> x * y
    double = times 2
    console.log double(3)  // 输出: 6
    
    numbers = [1 2 3]
    result = numbers |> map (* 2) |> sum
    console.log result  // 输出: 12
    

LiveScript 的问题

尽管 LiveScript 有很多优点,但也存在一些不足之处:

  1. 语法复杂度

    • LiveScript 引入了一些额外的运算符,如 ~=, ==, ===,这可能会增加学习曲线。例如:
    // LiveScript 示例
    console.log 1 ~= '1'  // 输出: true
    console.log [1, 2, 3] === [1, 2, 3]  // 输出: true
    console.log [1, 2, 3] ~= '[1, 2, 3]'  // 输出: false
    
  2. sourcemap 支持

    • LiveScript 目前还不支持 sourcemap,这对于前端开发来说可能是一个痛点,因为调试时无法直接定位到源码。
  3. 尾递归优化

    • 尽管 LiveScript 吸收了很多 Haskell 的特性,但它并不支持尾递归优化,这在处理大量数据时可能会导致栈溢出。

通过以上对比,我们可以看到 LiveScript 在某些方面确实提供了更好的体验,但在实际使用中也需要考虑其局限性。


<span onclick=“alert(1)”>11</span>

听说 Coco 是 coffee + Perl, LiveScript 是 coffee + Haskell. 语法真是要命得多

LiveScript 也算 Coco 的分支,所以也有Perl的味道,各种符号,比Haskell复杂得多

Node.js 下 LiveScript 和 CoffeeScript 的比较

LiveScript 比 CoffeeScript 好的地方:

  1. 区间表示

    // CoffeeScript
    console.log([1..5]) // [1, 2, 3, 4, 5]
    
    // LiveScript
    console.log([1 to 5]) // [1, 2, 3, 4, 5]
    console.log([1 til 5]) // [1, 2, 3, 4]
    

    使用 totil 表示闭区间和半开区间更直观。

  2. 变量作用域

    // CoffeeScript
    do (x = undefined, y = undefined) ->
      x = 1
      y = 2
    
    // LiveScript
    x := 1
    y := 2
    

    在 LiveScript 中,:= 可以显式地修改外部变量。

  3. 常量定义

    // CoffeeScript
    const PI = Math.PI
    
    // LiveScript
    const PI is Math.PI
    

    LiveScript 的 const 类似于 ES6 的 const,但最终会编译成 var

  4. 作用域块

    // CoffeeScript
    do ->
      x = 1
      y = 2
    
    // LiveScript
    let
      x is 1
      y is 2
    

    let 更加明确。

  5. 模块引入

    // CoffeeScript
    lib = require 'lib'
    
    // LiveScript
    require! lib
    
  6. 函数式编程语法糖

    // CoffeeScript
    times = (x, y) -> x * y
    double = times(2)
    
    // LiveScript
    times = (x, y) -> x * y
    double = times 2
    
    // CoffeeScript
    arr = [1, 2, 3]
    arr.map (n) -> n * 2
    .reduce (a, b) -> a + b
    
    // LiveScript
    [1 2 3] |> map (* 2) |> sum
    

LiveScript 的问题:

  1. 操作符复杂性

    // LiveScript
    1 ~= '1' # true
    [1, 2, 3] === [1, 2, 3] # true
    [1, 2, 3] ~= '[1, 2, 3]' # false
    

    操作符 ~====== 可能会导致混淆。

  2. sourcemap 支持: LiveScript 目前还不支持 sourcemap,这对于前端调试不利。

  3. 函数式编程的限制

    // LiveScript
    fib = (n) -> if n <= 1 then 1 else fib(n - 1) + fib(n - 2)
    

    尾递归优化目前还不支持,这可能影响性能。

回到顶部