基本操作逆引きリファレンス(CoffeeScript)

Node.jsと、現在使われているほとんどのブラウザで共通して使えるメソッドや文法を、用途ごとにまとめて紹介します。

文字列

文字列を作る

文字列は" "または' 'で囲います。" "の中で"を使ったり、' 'の中で'を使うには、\でエスケープします。

"abc"
'abc'
# 以下2つはどちらの書き方でも同じ意味
"I can't say \"no.\""
'I can\'t say "no."'

文字列に式を埋め込む

" "内では#{ }を使って、式や変数の値を埋め込むことができます。

"1 + 1 = #{1 + 1}"
# => '1 + 1 = 2'

文字数を取得する

文字列.lengthは、文字列の文字数を返します。

"abcいろは".length
# => 6

文字列を数値に変換する

parseInt(文字列, 10)は、文字列を数値に変換して返します。

# "123"という文字列を数値に変換してから2を足す
num = parseInt("123", 10)
num += 2
console.log num

【実行結果】

125

特定の位置の文字を得る

文字列[インデックス]で、インデックスの位置にある文字を取得できます。先頭の文字のインデックスは0です。

str = "abcde"
str[1]
# => 'b'

部分文字列を得る

文字列[範囲]で、文字列の一部を抜き出して新しい文字列を作れます。

str = "abcde"
str[1..3]
# => 'bcd'

先頭から文字列を探す

文字列.indexOf(部分文字列)は文字列の先頭から部分文字列を探し、最初に見つかったインデックスを返します。

# 文字列の先頭からbbを探す
"aabbccbbaa".indexOf("bb")
# => 2

文字列が見つからない場合は-1を返します。

# zを探す
"abc".indexOf("z")
# => -1

末尾から文字列を探す

文字列.lastIndexOf(部分文字列)は文字列の末尾から部分文字列を探し、最初に見つかったインデックスを返します。文字列が見つからない場合は-1を返します。

# 文字列の末尾からbbを探す
"aabbccbbaa".lastIndexOf("bb")
# => 6

文字列を置換する

文字列.replace(置換前の文字列, 置換後の文字列)は、文字列の一部を置き換えた文字列を返します。最初に見つかった1箇所だけが置換されます。

# 最初に見つかったbをzに置換する
"aaa".replace("a", "z")
# => 'zaa'

正規表現で文字列を置換する

文字列.replace(正規表現, 新しい文字列)は、正規表現にマッチした箇所を新しい文字列で置き換えた文字列を返します。最初にマッチした1箇所だけが置換されます。

"abcba".replace(/[ab]*/, "z")
# => 'zcba'

すべてのマッチ箇所を置換する

文字列.replace(正規表現, 新しい文字列)の正規表現にgフラグを指定すると、マッチしたすべての箇所が置換されます。

"abcba".replace(/[ab]/g, "z")
# => 'zzczz'

マッチ箇所を関数で置換する

文字列.replace(文字列または正規表現, 関数)のように第2引数に関数を指定すると、マッチした箇所が関数の戻り値で置き換えられます。関数に渡される引数は、第1引数がマッチした部分文字列、第2引数以降がキャプチャした文字列、最後から2番目の引数はマッチした位置、最後の引数は元の文字列全体です。

re = /(\d+)m/g
str = "3m 4 5m".replace re, (m, cap, pos, src) ->
  console.log "matched #{m} at #{pos}"
  "#{cap * 2}m"

console.log str

【実行結果】

matched 3m at 0
matched 5m at 5
6m 4 10m

特定の文字で分割する

文字列.split(セパレータ)は、文字列をセパレータで分割し、配列を作って返します。

"a-b-c-d-e".split("-")
# => [ 'a', 'b', 'c', 'd', 'e' ]

正規表現をセパレータとして使うこともできます。

"a-b!c@d#e".split(/\W/)
# => [ 'a', 'b', 'c', 'd', 'e' ]

小文字に変換する

文字列.toLowerCase()は、文字列をすべて小文字にした文字列を返します。

"ABC".toLowerCase()
# => 'abc'

大文字に変換する

文字列.toUpperCase()は、文字列をすべて大文字にした文字列を返します。

"abc".toUpperCase()
# => 'ABC'

先頭と末尾の空白を削除する

文字列.trim()は、文字列の先頭と末尾の空白を取り除いた文字列を返します。

"  abc  ".trim()
# => 'abc'

数値

文字列に変換する

数値.toString()は、数値を文字列に変換して返します。

str = 123.toString()
str.length
# => 3

四捨五入する

Math.round(数値)は、数値の小数点以下を四捨五入した整数を返します。

Math.round(12.5)
# => 13

小数第2位を四捨五入して小数第1位までの数にするには、下のように10倍してから四捨五入します。

num = 12.56
Math.round(num * 10) / 10
# => 12.6

同様に、小数第3位を四捨五入して小数第2位までの数にするには、100倍してから四捨五入します。

num = 12.567
Math.round(num * 100) / 100
# => 12.57

小数点以下を切り上げる

Math.ceil(数値)は、数値の小数点以下を切り上げた整数を返します。

num = 12.1
Math.ceil(num)
# => 13

小数点以下を切り捨てる

Math.floor(数値)は、数値の小数点以下を切り捨てた整数を返します。

num = 12.9
Math.floor(num)
# => 12

ランダムな数を得る

Math.random()は、0以上1未満のランダムな数値を返します。呼び出すたびに新しい乱数を取得できます。

Math.random()
# => 0.391274404944852 (実行のたびに変化します)

1以上100以下のランダムな整数を得るには、下のようにします。

Math.floor(Math.random() * 100) + 1
# => 43 (実行のたびに変化します)

最も大きい数を探す

Math.max(値1, 値2, ...)は、値1、値2、・・・の中で最も大きい数値を返します。

Math.max(4, 2, 8)
# => 8

最も小さい数を返す

Math.min(値1, 値2, ...)は、値1、値2、・・・の中で最も小さい数値を返します。

Math.min(4, 2, 8)
# => 2

累乗(べき乗)を求める

Math.pow(数値, exp)は、数値をexp乗した値を返します。

# 2の8乗
Math.pow(2, 8)
# => 256

平方根(ルート)を求める

Math.sqrt(数値)は、数値の平方根を返します。

Math.sqrt(9)
# => 3

絶対値を求める

Math.abs(数値)は、数値の絶対値を返します。

Math.abs(-123)
# => 123

自然対数をとる

Math.log(数値)は、数値の自然対数を返します。

Math.log(10)
# => 2.302585092994046

自然対数の底

Math.Eは自然対数の底eを表します。

Math.E
# => 2.718281828459045

円周率

Math.PIは円周率を表します。

Math.PI
# => 3.141592653589793

サインを求める

Math.sin(数値)は、数値(単位はラジアン)のサインを返します。

Math.sin(Math.PI / 2)
# => 1

コサインを求める

Math.cos(数値)は、数値(単位はラジアン)のコサインを返します。

Math.cos(Math.PI)
# => -1

タンジェントを求める

Math.tan(数値)は、数値(単位はラジアン)のタンジェントを返します。

# 30度のタンジェントを求める
deg = 30

# ラジアンに変換
rad = deg * Math.PI / 180

num = Math.tan(rad)
console.log num

【実行結果】

0.5773502691896257

アークサインを求める

Math.asin(数値)は、数値のアークサインをラジアンで返します。アークサインはサインの逆関数です。

Math.asin(1)
# => 1.5707963267948966
# (Math.PI / 2と同じ値)

アークコサインを求める

Math.acos(数値)は、数値のアークコサインをラジアンで返します。アークコサインはコサインの逆関数です。

Math.acos(-1)
# => 3.141592653589793

アークタンジェントを求める

Math.atan(数値)は、数値のアークタンジェントをラジアンで返します。アークタンジェントはタンジェントの逆関数です。

Math.atan(1)
# => 0.7853981633974483

また、Math.atan2(y, x)はX軸の正の向きと座標(x, y)との間の角度をラジアンで返します。引数をy、xの順で指定することに注意してください。

# X軸の正の向きと座標(x=20, y=40)との間の角度を求める
rad = Math.atan2(40, 20)

# ラジアンを度に変換
deg = rad * 180 / Math.PI

console.log deg

【実行結果】

63.43494882292201

度をラジアンに変換する

# 30度をラジアンに変換する
deg = 30
rad = deg * Math.PI / 180
console.log rad

【実行結果】

0.5235987755982988

ラジアンを度に変換する

# 1ラジアンを度に変換する
rad = 1
deg = rad * 180 / Math.PI
console.log deg

【実行結果】

57.29577951308232

配列

配列を作る

全体を[ ]で囲い、要素を,で区切ります。

[1, 2, 3]

要素を参照する

配列[インデックス]で要素を参照できます。先頭の要素のインデックスは0です。

arr = ["a", "b", "c"]
arr[1]
# => 'b'

要素に代入する

arr = [1, 2, 3]
# 2番目の要素に4を代入
arr[1] = 4
console.log arr

【実行結果】

[ 1, 4, 3 ]

先頭に要素を追加する

配列.unshift(値)は、値を新しい要素として配列の先頭に追加します。

arr = [1, 2, 3]
arr.unshift(0)
console.log arr

【実行結果】

[ 0, 1, 2, 3 ]

末尾に要素を追加する

配列.push(値)は、値を新しい要素として配列の末尾に追加します。

arr = [1, 2, 3]
arr.push(4)
console.log arr

【実行結果】

[ 1, 2, 3, 4 ]

先頭の要素を抜き出す

配列.shift()は、配列の先頭の要素を取り出します。取り出した要素は配列から削除されます。

arr = [1, 2, 3]
val = arr.shift()
console.log "val: #{val}"
console.log arr

【実行結果】

val: 1
[ 2, 3 ]

末尾の要素を抜き出す

配列.pop()は、配列の末尾の要素を取り出します。取り出した要素は配列から削除されます。

arr = [1, 2, 3]
val = arr.pop()
console.log "val: #{val}"
console.log arr

【実行結果】

val: 3
[ 1, 2 ]

配列の一部を抜き出す

配列[範囲]で、配列を部分的に抜き出して新しい配列を作ることができます。

arr = ["A", "B", "C", "D", "E"]
console.log arr[1..3]

【実行結果】

[ 'B', 'C', 'D' ]

連結して文字列を作る

配列.join(セパレータ)は、要素をセパレータで連結した文字列を作って返します。

# 「-」で要素を連結する
[1, 2, 3].join("-")
# => '1-2-3'

逆順に並び替える

配列.reverse()は、配列の要素を逆順に並び替えます。

arr = [1, 2, 3]
arr.reverse()
console.log arr

【実行結果】

[ 3, 2, 1 ]

辞書順にソートする

配列.sort()は、配列の要素を辞書順に並び替えます。

arr = ["cake", "apple", "banana"]
arr.sort()
console.log arr

【実行結果】

[ 'apple', 'banana', 'cake' ]

辞書順なので、数値の小さい順ではありません。

arr = [1, 10, 11, 100, 101]
arr.sort()
console.log arr

【実行結果】

[ 1, 10, 100, 101, 11 ]

数値の小さい順にソートする

配列.sortの第1引数を下のように指定します。

arr = [4, 2, 5, 10, 1]

# 数値の小さい順にソートする
arr.sort (a, b) -> a - b

console.log arr

【実行結果】

[ 1, 2, 4, 5, 10 ]

数値の大きい順にソートする

配列.sortの第1引数を下のように指定します。

arr = [4, 2, 5, 10, 1]

# 数値の大きい順にソートする
arr.sort (a, b) -> b - a

console.log arr

【実行結果】

[ 10, 5, 4, 2, 1 ]

任意の順でソートする

配列.sort(ソート関数)で引数にソート関数を指定すると、ソート順を任意に変更できます。このソート関数は、配列内の2要素を引数で受け取り、前後関係を戻り値で指示します。戻り値が0未満ならば第1引数の要素が第2引数の要素よりも先頭側、戻り値が0なら両方とも同じ位置、戻り値が0より大きければ第1引数の要素が第2引数の要素よりも末尾側に並び替えられます。

オブジェクトの特定のキーでソートするには下のようにします。

persons = [
  { name: "Sazae",  age: 24 }
  { name: "Katsuo", age: 11 }
  { name: "Wakame", age: 9  }
]

# ageの小さい順にソートするための関数
compareAge = (a, b) ->
  a.age - b.age

# ageの小さい順にソートする
persons.sort compareAge

# 出力する
for person in persons
  console.log "#{person.name}: #{person.age}"

【実行結果】

Wakame: 9
Katsuo: 11
Sazae: 24

シャッフルする

# arrayをシャッフルする関数
shuffle = (array) ->
  i = array.length
  if i is 0 then return false
  while --i
    j = Math.floor Math.random() * (i + 1)
    tmpi = array[i]
    tmpj = array[j]
    array[i] = tmpj
    array[j] = tmpi
  return

arr = [1..10]

# arrをシャッフルする
shuffle arr

console.log arr

上のコードは http://sedition.com/perl/javascript-fy.html をベースにして改変したものです。

【実行結果(実行のたびに変化します)】

[ 5, 1, 3, 10, 2, 8, 6, 7, 4, 9 ]

特定の要素を含むか調べる

値 in 配列は、配列の中に値と一致する要素があればtrue、なければfalseとなります。

arr = ["apple", "banana", "cake", "donut"]

# cakeが配列内にあるか調べる
if "cake" in arr
  console.log "cakeは含まれる"
else
  console.log "cakeは含まれない"

【実行結果】

cakeは含まれる

部分的に要素を削除する

配列.splice(index, num)は、indexの位置からnum個分の要素を削除します。

arr = [1..5]

# 2番目の要素から3個を削除する
arr.splice(1, 3)

console.log arr

【実行結果】

[ 1, 5 ]

部分的に要素を置き換える

配列.splice(index, num, 値1, 値2, ...)は、indexの位置からnum個分の要素を削除し、その場所に値1, 値2, ...を新しい要素として挿入します。

arr = [1..5]

# 2番目の要素から2個を削除し、
# 代わりの要素として"a"と"b"を挿入する
arr.splice(1, 2, "a", "b")

console.log arr

【実行結果】

[ 1, 'a', 'b', 4, 5 ]

削除する要素数と挿入する要素数は一致していなくても構いません。

arr = [1..5]

# 2個削除して3個挿入する
arr.splice(1, 2, "a", "b", "c")

console.log arr

【実行結果】

[ 1, 'a', 'b', 'c', 4, 5 ]

他の配列を連結する

配列.concat(配列1, 配列2, ...)は、配列の末尾に配列1, 配列2, ...に含まれる要素を連結した新しい配列を返します。引数には配列の代わりに値を直接指定することもできます。

arr = [1, 2, 3]
arr2 = arr.concat([4, 5], 6, 7, [8, 9])
console.log arr2

【実行結果】

[ 1, 2, 3, 4, 5, 6, 7, 8, 9 ]

関数

thisを決めて関数を呼び出す

関数は関数.applyで呼び出すこともできます。

関数.apply(thisとして使う値, 引数の配列)

第1引数に指定した値は、関数内でthisで参照できます。第2引数には、関数に渡す引数を配列で指定します。

func = (a, b, c) ->
  console.log "a=#{a} b=#{b} c=#{c}"
  console.log "this.name=#{@name}"

obj = { name: "John Smith" }

# funcを呼び出す
func.apply(obj, [11, 22, 33])

【実行結果】

a=11 b=22 c=33
this.name=John Smith

thisとして使う値を指定する必要がない場合は、第1引数にnullを指定します。

func.apply(null, [11, 22, 33])

また、関数.callメソッドでも関数を呼び出せます。引数を配列ではなく個別に指定する点以外は、使い方は関数.applyと一緒です。

関数.call(thisとして使う値, 引数1, 引数2, ...)

つまり、以下の2つの呼び出しは同じ結果となります。

func.apply(obj, [11, 22, 33])
func.call(obj, 11, 22, 33)

クラス

クラスを定義してインスタンスを作る

クラスを定義するには、class クラス名に続けて、ブロックで中身を書きます。クラスをもとにインスタンスを生成するには、new クラス名を呼びます。

# Catクラスを定義
class Cat
  # greetメソッドを定義
  greet: ->
    console.log "meow"

  # sleepメソッドを定義
  sleep: ->
    console.log "zzz"

# Catクラスのインスタンスを生成
michael = new Cat
michael.greet()

【実行結果】

meow

継承する

class クラス名 extends 継承元クラス名で、既存のクラス(親クラス)を継承して新しいクラス(子クラス)を作ることができます。

子クラスに存在しないプロパティが参照されると、親クラスに同名のプロパティが存在すれば自動的にそちらが参照されます。

# 親クラス
class Robot
  greet: ->
    console.log "コンニチハ"

# 子クラス
class AdvancedRobot extends Robot
  up: ->
    console.log "アガリマス"

  down: ->
    console.log "サガリマス"

bob = new AdvancedRobot
bob.up()
bob.down()
bob.greet()

【実行結果】

アガリマス
サガリマス
コンニチハ

特定のクラスのインスタンスかどうか調べる

値 instanceof クラス名は、値がそのクラスのインスタンスであればtrue、そうでなければfalseとなります。

# Animalクラス
class Animal

# Animalクラスを拡張したCatクラス
class Cat extends Animal

# Animalクラスを拡張したDogクラス
class Dog extends Animal

tama = new Cat
console.log "Cat: #{tama instanceof Cat}"
console.log "Dog: #{tama instanceof Dog}"
console.log "Animal: #{tama instanceof Animal}"

【実行結果】

Cat: true
Dog: false
Animal: true

上の例では、CatクラスがAnimalクラスを継承しているため、Catクラスのインスタンスであるtamaは、同時にAnimalクラスのインスタンスでもあります。

日付と時刻

現在の日時を取得する

# 現在時刻を保持したDateインスタンスを作る
d = new Date

year  = d.getFullYear()     # 年(西暦)
month = d.getMonth() + 1    # 月
date  = d.getDate()         # 日
hour  = d.getHours()        # 時
min   = d.getMinutes()      # 分
sec   = d.getSeconds()      # 秒
ms    = d.getMilliseconds() # ミリ秒(1000分の1秒)

str  = "#{year}年#{month}月#{date}日"
str += " #{hour}時#{min}分#{sec}秒"
console.log str

【実行結果】

2013年5月25日 16時17分40秒

曜日を取得する

DateインスタンスのgetDayメソッドは、曜日に応じて0〜6の値を返します。0が日曜日、6が土曜日を表します。

days = ["日", "月", "火", "水", "木", "金", "土"]

d = new Date
day = days[d.getDay()]
console.log "今日は#{day}曜日"

【実行結果】

今日は土曜日

1970年1月1日からの経過ミリ秒を得る

getTimeメソッドは、グリニッジ標準時の1970年1月1日から何ミリ秒経過したかを返します。

d = new Date
ms = d.getTime()
console.log "#{ms}ミリ秒"

【実行結果】

1369466310164ミリ秒

日時を指定してDateインスタンスを作る

new Date("年-月-日 時:分:秒.ミリ秒")の形で、日時を指定してDateインスタンスを作ることができます。

d = new Date("2013-05-25 16:19:45.500")
console.log d

【実行結果】

Sat May 25 2013 16:19:45 GMT+0900 (JST)

Dateインスタンスの日時を変更する

Dateインスタンスが保持する日時を変更するには下のようにします。

# 現在時刻を表すDateインスタンスを作る
d = new Date

# 2013年7月1日 11時22分33.000秒にセットする
d.setFullYear(2013)  # 2013年
d.setMonth(6)        # 7月
d.setDate(1)         # 1日
d.setHours(11)       # 11時
d.setMinutes(22)     # 22分
d.setSeconds(33)     # 33秒
d.setMilliseconds(0) # 0ミリ秒

console.log d

【実行結果】

Mon Jul 01 2013 11:22:33 GMT+0900 (JST)

また、setTime(数値)を使うと、1970年1月1日 0時0分0秒(グリニッジ標準時)からの経過ミリ秒で日時を指定することもできます。

d = new Date
d.setTime(0)
console.log d

【実行結果】

Thu Jan 01 1970 09:00:00 GMT+0900 (JST)

5日後の日時を求める

d = new Date
# 5日分のミリ秒を足す
d.setTime(d.getTime() + 5 * 24 * 60 * 60 * 1000)
console.log d

【実行結果】

Thu May 30 2013 16:25:32 GMT+0900 (JST)

5日前の日時を求める

d = new Date
# 5日分のミリ秒を引く
d.setTime(d.getTime() - 5 * 24 * 60 * 60 * 1000)
console.log d

【実行結果】

Mon May 20 2013 16:26:05 GMT+0900 (JST)

2つの日時の差を求める

d1 = new Date "2013-07-17 11:45:00 +0900"
d2 = new Date "2013-08-05 19:00:00 +0900"
diffMs = d2.getTime() - d1.getTime()

# ミリ秒を日、時、分に分解する
# 経過日数
days = parseInt(diffMs/(24*60*60*1000), 10)
diffMs -= days * 24 * 60 * 60 * 1000
# 経過時間
hours = parseInt(diffMs/(60*60*1000), 10)
diffMs -= hours * 60 * 60 * 1000
# 経過分
minutes = parseInt(diffMs/(60*1000), 10)

console.log "#{days}日#{hours}時間#{minutes}分"

【実行結果】

19日7時間15分

プログラムの実行時間を計測する

startTime = new Date().getTime()

# 計測したい処理
total = 0
for i in [1..10000000]
  total += i

elapsed = new Date().getTime() - startTime
console.log "経過時間: #{elapsed}ミリ秒"

【実行結果】

経過時間: 19ミリ秒

異なる時間帯を扱う

Dateインスタンスは、動作環境の時間帯を基準として使います。以下のプログラムは、OSをどの時間帯に設定しているかによって動作が変わります。

d = new Date "2013-06-02 16:38:15"

# 1970年1月1日からの経過ミリ秒を出力する
console.log d.getTime()

日本時間に設定しているOSで上のプログラムを実行すると下のように出力されます。日本時間はグリニッジ標準時より9時間早い時間帯です。

1370158695000

一方、ベネズエラ時間に設定しているOSで同じプログラムを実行すると下のように出力されます。ベネズエラ時間はグリニッジ標準時より4時間30分遅い時間帯です。

1370207295000

このように動作環境の設定時間帯によって値が変化するのを防ぐには、以下のように+0900のような形式で時間帯を指定します。+0900はグリニッジ標準時より9時間0分早い時間帯であることを表しています。

# 日本時間(GMT+9時間)で時刻を指定する
d = new Date "2013-06-02 16:38:15 +0900"
console.log d.getTime()

【実行結果】

1370158695000

同じようにして、どの時間帯の時刻でも指定できます。

# ベネズエラ時間(GMT-4時間30分)で時刻を指定する
d = new Date "2013-06-02 16:38:15 -0430"
console.log d.getTime()

【実行結果】

1370207295000

文字列を整数に変換する

parseInt(文字列, 10)は、文字列を整数に変換して返します。小数点以下がある場合は切り捨てられます。

parseInt("123", 10)
# => 123

数値に変換できない場合はNaNになります。

parseInt("abc", 10)
# => NaN

文字列を小数に変換する

parseFloat(文字列)は、文字列を小数に変換して返します。

parseFloat("123.45")
# => 123.45

16進数の文字列を整数に変換する

parseInt(文字列, 基数)で、10進以外の文字列を数値に変換することも可能です。基数には2から36までの値を指定可能です。

# "ff"を16進数として解釈する
parseInt("ff", 16)
# => 255

数値を文字列に変換する

数値.toString()は、数値を文字列に変換して返します。

123.toString()
# => '123'

数値を16進数の文字列に変換する

数値.toString(基数)で、数値を10進以外の文字列に変換できます。基数には2から36までの値を指定可能です。

# 123を16進文字列に変換
123.toString(16)
# => '7b'

NaNかどうか調べる

isNaN(数値)は、数値がNaNならばtrue、そうでなければfalseを返します。NaN is NaNはfalseです。

num = 0 / 0  # 結果はNaN

if isNaN(num)
  console.log "NaNなんです"
else
  console.log "NaNではないんです"

【実行結果】

NaNなんです

型を調べる

typeof(値)は、値の型を文字列で返します。戻り値の内訳は以下の通りです。

typeofの戻り値意味
undefined未定義値
booleantrueまたはfalse
number数値
string文字列
function関数
objectオブジェクト

変数として一度も定義していなくてもtypeofで調べることができます。

console.log typeof(abcde)
console.log typeof(123)
console.log typeof({ abc: 123 })

【実行結果】

undefined
number
object

エラー

エラーを発生させる

エラーオブジェクトをthrowすると、そこでプログラムの実行が止まります。

throw new Error "エラーメッセージ"

【実行結果】

Error: エラーメッセージ
  ...(以下省略)

エラーをキャッチする

エラーが発生してもプログラムの実行が止まらないようにするには、下のようにtrycatchを使います。また、任意でfinallyブロックを指定することもできます。

try
  # エラーが発生する可能性のある処理
  something()
catch e
  # エラーが発生した場合に実行する処理
  console.log e.name    # エラー名
  console.log e.message # エラーメッセージ
finally
  # エラーが発生してもしなくても実行する処理
  console.log "done"

独自のエラークラスを作る

Errorを継承した独自のクラスを用意すると、複雑なプログラムを作る際などに便利です。

# 独自のエラークラスを定義
class UserNotFoundError extends Error
  constructor: (@message='ユーザーが見つかりません') ->
    @name = 'UserNotFoundError'

showEntry = (name) ->
  message = "ユーザー#{name}が見つかりません"
  throw new UserNotFoundError message

try
  showEntry 'taro'
catch e
  if e instanceof UserNotFoundError
    console.log "[#{e.name}] #{e.message}"
  else
    console.log "予期しないエラーが発生: #{e}"
    # エラーを再度投げる
    throw e

【実行結果】

[UserNotFoundError] ユーザーtaroが見つかりません

JSON

ブラウザでJSONを扱う際は、json2.jsというライブラリを読み込んでおくと、古いブラウザでも以下に挙げるメソッドが動作します。

オブジェクトや配列をJSON文字列に変換する

JSON.stringify(値)は、値をJSON文字列に変換して返します。

str = JSON.stringify({
  destination: "London"
  origin: "Tokyo"
})
console.log str

【実行結果】

{"destination":"London","origin":"Tokyo"}

JSON文字列をオブジェクトや配列に変換する

JSON.parse(文字列)は、JSON文字列を適切な値に変換して返します。

str = '{"destination":"London","origin":"Tokyo"}'
obj = JSON.parse(str)
console.log obj.origin

【実行結果】

Tokyo

JSONとして解釈できない文字があるとエラーが発生してしまうので、下のようにtry-catchで囲んでおくとよいでしょう。

try
  JSON.parse 'abc'
catch e
  console.log e

【実行結果】

[SyntaxError: Unexpected token a]

数値の表記

CoffeeScriptでは数値を10進数の代わりに2進数、8進数、16進数で表記することもできます。いずれも10進数で記述した場合と実行結果は変わりません。

2進表記

0b(ゼロ ビー)で始まるものは2進数として解釈されます。bはbinary(2進法)を意味します。

2進表記10進数
0b11
0b102
0b113
0b1015
0b11111111255

使用例

console.log 0b101 + 0b11

【実行結果】

8

8進表記

0o(ゼロ オー)で始まるものは8進数として解釈されます。oはoctal(8進法)を意味します。

8進表記10進数
0o11
0o108
0o119
0o2016
0o7763
0o10064
0o377255

16進表記

0x(ゼロ エックス)で始まるものは16進数として解釈されます。xはhexadecimal(16進法)を意味します。

16進表記10進数
0x11
0x1016
0x1117
0x2032
0xff255
0x100256

その他

指定時間後に関数を実行する

setTimeout(func, ms)は、msミリ秒後に関数funcを実行します。下のプログラムを実行すると、helloが出力された1秒後にworldが出力されます。

doAfter = ->
  console.log "world"

console.log "hello"
setTimeout(doAfter, 1000)

【実行結果】

hello
(ここで1秒経過)
world

URLエンコードする

encodeURIComponent(文字列)は、文字列をURLエンコードしたものを返します。漢字などASCII以外の文字をURLで使える形式に変換できます。

encodeURIComponent("検索")
# => '%E6%A4%9C%E7%B4%A2'

URLデコードする

decodeURIComponent(文字列)は、URLエンコードされた文字列を元に戻して返します。

decodeURIComponent("%E6%A4%9C%E7%B4%A2")
# => '検索'