Nodejs下LiveScript和CoffeeScript的比较
Nodejs下LiveScript和CoffeeScript的比较
LiveScript比CoffeeScript好的地方:
[ x to y ]
和[ x til y]
, 比[ x .. y ]
和[ x ... y ]
清楚多了。for i from x to y
和for i from x til y
同理。- 默认情况下变量赋值不会污染外层的变量,再也不用
do ( x = undefined, y = undefined, ...) ->
了。如果需要修改外层变量的值,则使用:=
。 const
定义常量,类似于ES6中的const
,但是最终会编译成var
,兼容不支持const
的引擎。do
换成了let
,更明白清晰。require
可以写得更短:require! lib
代替lib = require 'lib'
- 各种函数式编程的语法糖,
(+ 2) 4
,times = (x, y) --> x * y; double = times 2
,[1 2 3] |> map (* 2) |> sum
等等。
LiveScript的问题:
-
有些语法不太好记,JavaScript里的
==
和===
已经让人迷惑了,LiveScript里则是~=
、==
和===
。LiveScript里,以下值为true1 ~= '1'
,[1, 2, 3] === [1, 2, 3]
,但是`[1, 2, 3] ~= '[1, 2, 3]'是false。 -
sourcemap支持还没有。后端开发的话,直接
lsc
运行,问题不大,但是前端在浏览器里调试就痛苦了。 -
语法吸收了很多Haskell,让人忍不住想用函数式的写法,但是并没有尾递归优化等支持。
via my blog
Node.js 下 LiveScript 和 CoffeeScript 的比较
LiveScript 比 CoffeeScript 好的地方
LiveScript 和 CoffeeScript 都是 JavaScript 的超集,它们的目标都是简化代码编写并提高可读性。但在某些方面,LiveScript 提供了一些独特的优势。
-
范围和循环语法更清晰
- 在 LiveScript 中,你可以使用
[ x to y ]
和[ x til y]
来表示闭区间和开区间,这比 CoffeeScript 的[ x .. y ]
和[ x ... y ]
更直观。
// LiveScript 示例 for i from 1 to 5 console.log i
- 在 LiveScript 中,你可以使用
-
变量作用域管理
- LiveScript 默认情况下不会污染外层的变量。如果你需要修改外层变量,可以使用
:=
操作符。
// LiveScript 示例 do x := 10 console.log x // 输出: 10
- LiveScript 默认情况下不会污染外层的变量。如果你需要修改外层变量,可以使用
-
常量定义
- LiveScript 提供了
const
关键字来定义常量,类似于 ES6 中的const
,但最终会被编译成var
,以保持兼容性。
// LiveScript 示例 const PI = 3.14
- LiveScript 提供了
-
简洁的模块导入
- LiveScript 允许你用更简洁的方式导入模块,如
require! lib
替代lib = require 'lib'
。
// LiveScript 示例 myLib = require! 'my-lib'
- LiveScript 允许你用更简洁的方式导入模块,如
-
函数式编程的语法糖
- 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 有很多优点,但也存在一些不足之处:
-
语法复杂度
- 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
- LiveScript 引入了一些额外的运算符,如
-
sourcemap 支持
- LiveScript 目前还不支持 sourcemap,这对于前端开发来说可能是一个痛点,因为调试时无法直接定位到源码。
-
尾递归优化
- 尽管 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 好的地方:
-
区间表示:
// 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]
使用
to
和til
表示闭区间和半开区间更直观。 -
变量作用域:
// CoffeeScript do (x = undefined, y = undefined) -> x = 1 y = 2 // LiveScript x := 1 y := 2
在 LiveScript 中,
:=
可以显式地修改外部变量。 -
常量定义:
// CoffeeScript const PI = Math.PI // LiveScript const PI is Math.PI
LiveScript 的
const
类似于 ES6 的const
,但最终会编译成var
。 -
作用域块:
// CoffeeScript do -> x = 1 y = 2 // LiveScript let x is 1 y is 2
let
更加明确。 -
模块引入:
// CoffeeScript lib = require 'lib' // LiveScript require! lib
-
函数式编程语法糖:
// 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 的问题:
-
操作符复杂性:
// LiveScript 1 ~= '1' # true [1, 2, 3] === [1, 2, 3] # true [1, 2, 3] ~= '[1, 2, 3]' # false
操作符
~=
、==
和===
可能会导致混淆。 -
sourcemap 支持: LiveScript 目前还不支持 sourcemap,这对于前端调试不利。
-
函数式编程的限制:
// LiveScript fib = (n) -> if n <= 1 then 1 else fib(n - 1) + fib(n - 2)
尾递归优化目前还不支持,这可能影响性能。