基本操作逆引きリファレンス(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 | 未定義値 |
boolean | trueまたは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: エラーメッセージ ...(以下省略)
エラーをキャッチする
エラーが発生してもプログラムの実行が止まらないようにするには、下のようにtry
とcatch
を使います。また、任意で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進数 |
---|---|
0b1 | 1 |
0b10 | 2 |
0b11 | 3 |
0b101 | 5 |
0b11111111 | 255 |
使用例
console.log 0b101 + 0b11
【実行結果】
8
8進表記
0o
(ゼロ オー)で始まるものは8進数として解釈されます。oはoctal(8進法)を意味します。
8進表記 | 10進数 |
---|---|
0o1 | 1 |
0o10 | 8 |
0o11 | 9 |
0o20 | 16 |
0o77 | 63 |
0o100 | 64 |
0o377 | 255 |
16進表記
0x
(ゼロ エックス)で始まるものは16進数として解釈されます。xはhexadecimal(16進法)を意味します。
16進表記 | 10進数 |
---|---|
0x1 | 1 |
0x10 | 16 |
0x11 | 17 |
0x20 | 32 |
0xff | 255 |
0x100 | 256 |
その他
指定時間後に関数を実行する
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") # => '検索'