Skip to content

Instantly share code, notes, and snippets.

@focusj
Created December 13, 2014 15:26
Show Gist options
  • Save focusj/3c33a0e966b11f9ab75c to your computer and use it in GitHub Desktop.
Save focusj/3c33a0e966b11f9ab75c to your computer and use it in GitHub Desktop.
记录了一些CoffeeScript一些语法方便查阅
# CoffeeScript CheetSheet#
## Declaration
### there is no vars, and no need to add ';' and the end
i = 10
str = "hello world"
[firstName, lastName] = ["kang", "wang"]
### define a function, no need to add the keyword 'function', -> is enough
fn = (param) - ...
### Splats: define a function with multi parameters
fn = (parm1, parm1, params...) ->
...
params = ["value1", "value2", "value3", "value4"]
fn(params)
fn("value", params)
fn("value", "value", params)
### define an Array
arr = [
"element1"
"element2"
]
### define an object
obj =
first: 1
second:
second_1: 1
second_2: 2
third: 3
$('.element').attr class: "active"
### lexical scoping and variable safity.
outter = 10
scope = ->
inner = 10
>> outter = 20
inner = 20
## String Interpolation
### mixin variable and function in string defination
str = "variable 1: #{var1}, function 1 returns: #{fn()}"
str = "
today is Sunday
so tomorrow is
Monday
"
htmlTpl = """
<html>
<body>
<h1>Hello World</h1>
</body>
</html>
"""
## Destructuring Assignment
[var1, var2] = [value1, value2]
### use on object unapply
{firstName, lastName} = {firstName: "Kang", lastName: "Wang"}
### use for a function multi-returns
location () ->
["US", "LA", "Berkly"]
[county, province, city] = location()
[start, end] = "hello, world".split ","
### use to skip some useless bucket ...
[start, ..., end] = [1, 2, 3, 4, 5]
### destructuring constructor
class Person
constructor: (options) ->
{@name, @age, @height} = options
tim = new Person age: 4
## condition control
### if else then
"do something" if true
if true and true
"do something"
else
"do other things"
if true then "do something" else "do other things"
## for loop control
### for loop while until
print ele for ele in [1, 2, 3, 4]
prints i, ele for ele in [1, 2, 3, 4]
print ele for ele in [1, 2, 3, 4] when ele / 2 != 1
countDown = (num for num in [10 .. 1] by 2)
### loop an object
prints k, v for k, v of kid
print ele until ele > 10
print ele while ele > 10
### do keywords
for filename in list
do (filename) ->
fs.readFile filename, (err, contents) ->
compile filename, contents.toString()
for ele in [1, 2, 3, 4]
do print ele
## try .. catch .. expression
try
fn(1)
catch error
error
finally
then
## try .. catch .. expression
### Array Operations
numSerials = [10 .. 0]
start = numSerials[0..2]
end = numSerials[0..-2]
end = numSerials[..]
umSerials[0..2] = [1, 2, 3]
### use expression as much as possible
globals = (name for name of window)[0...10]
## Existantial Operator ?, ?.
### '?' means varaible is null or undefiend
solipsism = true if mind? and world?
speed = 0
speed ?= 15
footprints = yeti ? "bear"
### '?.' usef for assessing object attribute
kid.brother?.sister
## switch when else
switch day
when "Mon" then ""
when "Tue" then ""
else "WTF"
day = switch day
when "Mon" then ""
when "Tue" then ""
else "WTF"
## object oriented
### use => to bind this in scope
Account = (customer, cart) ->
@customer = customer
@cart = cart
$('.shopping_cart').bind 'click', (event) =>
@customer.purchase @cart
Account2 = (customer, cart) ->
@customer = customer
@cart = cart
$('.shopping_cart').bind 'click', (event) ->
@customer.purchase @cart
### bind function to an exists function
Array::map = ->
"..."
## some sugar
### chained comparasion
cholesterol = 127
healthy = 200 > cholesterol > 60
### block regular expression
OPERATOR = /// ^ (
?: [-=]> # function
| [-+*/%<>&|^!?=]= # compound assign / compare
| >>>=? # zero-fill right shift
| ([-+:])\1 # doubles
| ([&|<>])\2=? # logic / shift
| \?\. # soak access
| \.{2,3} # range or splat
) ///
### embeded javascript
fn = `function fn() {}`
## operators and alias in CoffeeScript
CoffeeScript JavaScript
is ===
isnt !==
not !
and &&
or ||
true, yes, on true
false, no, off false
@, this this
of in
in no JS equivalent
a ** b Math.pow(a, b)
a // b Math.floor(a / b)
a %% b (a % b + b) % b
## multi etends example
moduleKeywords = ['extended', 'included']
class Trait
@mixin: (obj) =>
for key, value of obj when key not in moduleKeywords
@::[key] = value
obj.with?.apply(@)
this
@with: (objs ...) ->
@mixin obj for obj in objs
MongoDao =
find: () -> console.log("find items in mongo")
create: () -> console.log("delete item in mongo")
class UserDao extends Trait
@with Daoable, MongoDao
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment