CoffeeScript 简明教程

翻译:镇雷 校对:龙抓槐守望者 排版:Daniel

本节内容主要介绍 CoffeeScript 的基本语法,或者当做备忘录来使用。通过以下内容,不仅专注于 Framer Studio 的设计师,其他任何想要学习 CoffeeScript 的人都可以在段时间内掌握这门语言。

值得学习 CoffeeScript 的理由:

  • 简介易读的语法,容易学习和上手。

  • 帮助开发者避开 Javascript 的困难部分。

  • 可使用快捷键进行高效工作。

基本语法

注释

注释使用前缀#来表示这不是实际的代码,开发者通常使用注释以说明附近代码的具体功能。

# I am a comment
5 + 6 # I am a comment too

打印与输出

开发者可以通过将变量打印出来以检验代码的正确性。

console.log "Hello" # Output: Hello
console.log "Hello", "World" # Output: Hello World

空格

CoffeeScript 对空格和 Tab 是敏感的,它们被用来代替 Javascript 中的 { 和 } ,这意味着如果代码中的空格和 tab 不正确,程序将会出错。

if 1 + 1 == 2
    console.log "hello" # This will work

if 1 + 1 == 2
console.log "hello" # This will fail (missing tab)

变量

变量是一个带有名称的容器,用来存储数据和信息,它的用法非常简单:

myVariable = 1

上述例子中的变量 myVariable 中包含了数据 1,开发者也可以为其分配任意的其他值。

倘若一个变量没有赋值,则其会返回一个特殊值 ’undefined’ ,因此当程序报错 undefined 时,很有可能是开发者正在使用一个实际还不存在(未赋值)的变量。

通过后面的内容,我们将看到变量可以存储各种不同类型的数据。

数据类型

布尔型数据

每一个布尔型数据只有两种值:false 或 true:

myBoolA = true
myBoolB = false

数可以是整数、小数等,当然还包括正数和负数。

myNumberA = 2
myNumberB = 20.0
myNumberC = -223894

数可以直接进行各种运算,比如:

myNumberA + myNumberB  # Add, output: 22.0
myNumberA / myNumberB  # Divide, output: 0.10
myNumberA * myNumberB  # Product, output: 40.0
myNumberA ** myNumberB # Power, output: 400.0

字符串

字符串是一系列字母的集合,它可以是一个单词,也可以是一个完整的句子:

myStringA = "Hello there”

开发者可以将字符串进行组合:

myStringB = "#{myStringA}, I am the dude"
# Output: "Hello there, I am the dude"

字符串还存放许多通过数没法表达的数据:

myStringC = "rgba(255,0,0,0.1)"
myStringD = "1px solid #FFFFFF”

数组

数组用于存放一系列有顺序的数据(支持各种数据类型),与其他语言一样,CoffeeScript 也支持多维数组(即由数组组成的数组)。

myListA = [1, 2, 3, 4, 5] # Just numbers
myListB = [1, "test", 22, [1, 2, 3]] # Mixed

开发者可以通过编号(索引)来定位数组中的任一数据,编号从 0 开始。

myListA[0] # Output: 1
myListA[4] # Output: 5

开发者也可以通过自带的函数统计数组的长度:

myListB.length # Output: 4

或者获取某一编号范围内的数据: myListB[0..2] # Output: [1, 2, 3]

对象

对象与列表有些类似,区别则在于除了通过编号索引以外,对象还可以通过字符串来进行索引。(译者注:键值对)

myObjectA = {name:"Framer", age:12}

也可以通过下面的方式来创建对象,这和上述方法是等效的:

myObjectA =
    name: "Framer"
    age: 12

通过关键词索引数据:

myObjectB["name"] # Output: “Framer"

如果所使用的关键词不存在,则会返回 undefined:

myObjectB["nothere"] # Output: undefined

一旦开发者创建了一个对象,也可以为其增添新的内容:

myObjectB["platform"] = “Mac"

当然你也可以移除一些内容:

delete myObjectB["platform"]
myObjectB["platform"] # Output: undefined

函数

函数是一整块的可执行代码,顾名思义,它的功能和数学中的函数非常类似——接收输入,产生输出。函数的运行称为『调用』,而函数的输入称为『参数』。

什么情况下我们需要使用函数:

1.描述一个任务,但是只在需要的时候调用它 2.将那些不断重复的工作归入一个函数中,方便开发者对其反复调用

下面的例子介绍了如何定义一个函数,其方式与定义变量非常类似。关键词 return 将一个值传给函数的调用者(默认情况下,CoffeeScript 将返回最后一个被使用的变量)。

myFunction = (input) -> 
    output = input * 2
    return output

调用函数,并且将 42 作为参数传入:

myFunction(42) # Output: 84

开发者还可以将函数的输出直接赋值给一个新的变量:

myCalculatedNumber = myFunction(42)
myCalculatedNumber # Output: 84

当然,函数可以定义一些列不同类型的参数:

myFunction = (argumentA, argumentB, argumentC) ->
    return argumentA + argumentB + argumentC

比较器

比较器用来比较数据,如常用的等于、大于、小于等。

4 is 4 # Output: true
4 isnt 4 # Output: false
4 < 5 # Output true
4 > 5 # Output false

开发者可以使用 or 或者 and 来组合比较器:

4 is 4 and 5 < 4 # Output false
4 is 4 or 5 < 4 # Output true

条件语句

条件语句结合比较器,可以用以定义程序逻辑。条件语句的关键词有 if,else if,和 else。

if age > 21
    console.log "Over 21!”

再来看一个稍复杂一些的例子:

if age < 21
    console.log "Young"
else if age < 65
    console.log "Adult"
else
    console.log “Senior"

循环语句

循环语句用来进行程序中的重复计算,循环体可以是数组或对象。循环关键字为 for。

关于数组循环的例子:

myArray = [1, 2, 3, 4, 5]

for number in myArray
    number + 1

# Output: 2, 3, 4, 5, 6

一个含有键值对的对象也可以纳入到循环中来,将关键字 in 改为 of 即可:

myObject =
    name: "Koen"
    city: "Amsterdam"
    age: 31

for key, value of myObject
    key, "=", value 

# Output: name=Koen, city=Amsterdam, age=31

常见错误

SyntaxError … unexpected …:编译器遇到一段用途不明的代码(一般可能是语法错误)。

ReferenceError … Can’t find variable …:你正在使用一个编译器不能识别的变量,可能是对其申明有误。

更多 CoffeeScript 资源

推荐一些优质的站点,帮助那些希望在 CoffeeScript 上走的更远的设计师和开发者: