概要

CoffeeScriptの特徴

  • 変数宣言のvarは不要(自動で宣言される)
  • 行末のセミコロンは不要
  • 波括弧はインデントで表現
  • 丸括弧は曖昧性がない場合は省略可能
message = "Hello, world!"
if message.length > 1
  alert message
var message;
message = "Hello, world!";
if (message.length > 1) {
  alert(message);
}

コメント

1行コメント

# コメント

コンパイル時に消去される

複数行コメント

### コメント ###

コンパイル時に消去されない

変数

変数・式を展開

ダブルクォーテーション内で可能。

alert "Hi, #{name}!"
alert "Hi, " + name + "!";
alert "15/3=#{15/3}"
alert("15/3=" + (15 / 3));

文字列

改行の扱い

s = "apple
banana
orange"
var s;
s = "apple banana orange";

ヒアドキュメント

s = """apple
banana
orange"""
var s;
s = "apple\nbanana\norange";

配列

配列の定義

a = [1, 2, 3]

,は改行で代用もできる:

a = [
  1, 3, 5
  2, 4, 6
]
var a;
a = [1, 3, 5, 2, 4, 6]

連想配列の定義

a = {"yamada": 100, "suzuki": 200}
a =
  "yamada": 100
  "suzuki": 200

複雑な連想配列も作成できる:

a =
  "yamada":
    "sales": 100
    "cost" : 200
  "suzuki":
    "sales": 200
    "cost" : 300

範囲演算子

1から5までの配列を作成:

a = [1..5]
var a;
a = [1, 2, 3, 4, 5];

...は、最後の数値は含まない:

a = [1...5]
var a;
a = [1, 2, 3, 4];

条件分岐

if

if 条件式
  真の場合の処理
if 条件式
  真の場合の処理
else
  偽の場合の処理
if 条件式
  真の場合の処理
else if 条件式
  真の場合の処理
else
  偽の場合の処理
score = 70
if score > 80
  alert 'OK'
else if score > 60
  alert 'So-so'
else
  alert 'NG' 

後置if

alert "OK" if score > 80

switch(値に一致した場合に実行)

switch 変数
  when '値'           # 値に一致した場合
    処理
  when '値', '値'     # 複数の値を指定できる
    処理
  else               # どの値にも一致しない場合
    処理
signal = 'red'
switch signal
  when 'red'
    alert 'stop!'
  when 'green'
    alert 'go!'
  else
    alert 'caution!'

when 値 then 処理と1行でも書ける:

when 'red' then alert 'stop!'

変数が定義済みかどうか

alert 'OK' if name?
if (typeof name !== 'undefined' && name !== null) alert('OK');

繰り返し

for(条件が真の間繰り返し)

for 変数 in 配列
  処理
for i in [1..3]
  alert i
var i, _i;
for (i = _i = 1; _i <= 3; i = ++_i) {
  alert(i);
}
a = ['yamada', 'tanaka', 'suzuki']
for i in a
  alert "Hi, #{i}"
var a, i, _i, _len;
a = ['yamada', 'tanaka', 'suzuki'];
for (_i = 0, _len = a.length; _i < _len; _i++) {
  i = a[_i];
  alert("Hi, " + i);
}

インデックスを取得(0〜):

a = ['yamada', 'tanaka', 'suzuki']
for i, index in a
  alert "Hi, #{index}: #{i}"
var a, i, index, _i, _len;
a = ['yamada', 'tanaka', 'suzuki'];
for (index = _i = 0, _len = a.length; _i < _len; index = ++_i) {
  i = a[index];
  alert("Hi, " + index + ": " + i);
}

連想配列のループ

for key, value of 連想配列
  処理
sales =
  'yamada': 100
  'tanaka': 200
  'suzuki': 300
for key, value of sales
  alert "#{key}: #{value}"
var key, sales, value;
sales = {
  'yamada': 100,
  'tanaka': 200,
  'suzuki': 300
};
for (key in sales) {
  value = sales[key];
  alert("" + key + ": " + value);
}

演算子

比較演算子

is ===
isnt !==
score = 70
if score is 80
  alert 'OK'
else
  alert 'NG'

論理演算子

and &&
or ||
not !

連結比較式

alert "OK" if 80 < score < 90
if ((80 < score) && (score < 90)) {
  alert("OK");
}

関数

関数の定義

変数名 = ->
  処理
変数名 = (引数1, 引数2...) ->
  処理

例:

hello = ->
  alert 'Hello!'
var hello;
hello = function() {
  return alert('Hello!');
};
hello = (s) ->
  alert "Hello, #{s}"
var hello;
hello = function(s) {
  return alert('Hello, ' + s);
};

変数に無名関数を代入するように変換される。

関数の実行

変数名
変数名 引数1, 引数2...

例:

hello
hello "yamada", "tanaka"

引数の初期値

引数を指定しない場合の処理

変数名 = (引数1 = 初期値1, 引数2 = 初期値2...) ->
  処理

例:

hello = (s = "yamada") ->
  alert 'Hello!'
var hello;
hello = function(s) {
  if (s == null) {
    s = "yamada";
  }
  return alert('Hello!');
};

返り値

最後に実行されたものが返り値となるので、明示的に返り値を指定する場合以外は、returnを付ける必要はない

返り値付き関数の実行

var foo = hello();
console.log(hello());