035. coffeescript 笔记 - cwy007/tips-and-skills GitHub Wiki
1. 语法 & 概念
- 
在CoffeeScript程序中空格是有意义的 
- 
CoffeeScript的解释器 
- 
CoffeeScript去掉了分号 
- 
注释格式与Ruby的一致,以一个哈希字符开头。 # A comment
###
      A multiline comment, perhaps a LICENSE.
###
5. 变量和作用域
CoffeeScript使用一个匿名函数把所有脚本 都包裹起来,将其限定在局部作用域中
- 通过直接给全局对象(浏览器中的window)赋值来获得全局变量 也可以通过下面这种模式。
exports = this 
exports.MyVariable = "foo-bar"
在顶级作用域中,this就相当于全局对象
- CommonJS模块
8. 函数
- 
移除了冗长的function语句,以瘦箭头->替之 
- 
函数的最后一个表达式会作为隐式的返回值 
- 
函数名,函数参数,函数体 CoffeeScript允许你通过在箭头前面的括号中指定参数。 times = (a, b) -> a * b
还支持默认参数,例如:
times = (a = 1, b = 2) -> a * b
可以使用参数槽(splats)接收多个参数,使用...表示:
    sum = (nums...) ->
      result = 0
      nums.forEach (n) -> result += n
      result
12. 函数上下文
- ->的变种胖箭头的函数=> 使用胖箭头代替普通箭头是为了确保函数的上下文可以绑定为当前的上下文。例如:
this.clickHandler = -> alert "clicked" 
element.addEventListener "click", (e) => this.clickHandler(e)
- 
对象字面量 
- 
执行体 
- 
CoffeeScript并不支持条件运算符,作为替代你应该使用单行的if/else 语句。 
# Equivalent to:
# (1>0)?"Ok":"Y2K!"
if 1 > 0 then "Ok" else "Y2K!"
- 
在if语句前使用前缀表达式。 alert "It's cold!" if heat < 5
- 
可以使用not关键字来代替感叹号(!)来做取反操作 
- 
unless关键字,即if的否定。 
- 
is语句,编译过去就是===。 
if true is 1
  "Type coercion fail!"
- isnt代替is not。
22. 字符串插值法
- 循环和列表解析
for name in ["Roger", "Roderick", "Brian"] 
  alert "Release #{name}"
# 加上索引
for name, i in ["Roger the pickpocket", "Roderick the robber"] 
  alert "#{i} - Release #{name}"
- 测数组中是否存在某个值是一件麻烦事
words = ["rattled", "roudy", "rebbles", "ranks"]
alert "Stop wagging me" if "ranks" in words
- 
@,是this的别名。 
- 
::,prototype的别名 
- 
CoffeeScript存在操作符 ?只会在变量为null或者undefined的时候会返回真,与Ruby的nil?类似praise if brian?
- 
你还能用它来替换||操作符: velocity = southern ? 40
- 
如果你在访问属性之前进行null检查, 你可以把存在操作符放在它左边来跳过检查。 这与 Actice Support的try方法比较类似。blackKnight.getLegs()?.kick()
你能够用同样的方法检查一个属性是否是函数,是否可以调用,把存在操作符放在括号之前 就行。
如果属性不存在,或者不是一个函数,则就不会被调用。
blackKnight.getLegs().kick?()