Coffee Script入門した
ドットインストールでcoffee script入門やってた。 http://coffeescript.org/ の TRY COFFEESCRIPT のタブで試しながら打てる。
メモ。
コメント
# comment for 1 line ### comment for multiple line ###
生JSと違うところ
- var は書く必要がない(というよりreserved wordとして書けない)
- ; いらない
- {} rubyらしいブロックを使う
- () 曖昧性が無い場合は省略可.
- "#{string_var}" で文字列展開が出来る
条件分岐
# ruby input = 1 case input when 1, 10 puts input when 2 then puts input else puts input end
# coffee input = 1 switch input when 1, 10 console.log input when 2 then console.log input else console.log input
# 複数行 msg = "this is a very long msg" # インデントしても良きに解釈してくれる msg = "this is a very long msg" # heredoc html = """ <div id="main"> hello </div> """ # => # var html; # html = "<div id=\"main\">\n hello\n</div>";
配列
配列を改行で扱える
a = [1,2,3]; b = [ 1 3 5 # インデントは揃える事 ] m = [0..5] => m = [0, 1, 2, 3, 4, 5]; n = [0...5] => n = [0, 1, 2, 3, 4]; console.log(m[1..3]) => [1,2] console.log(m[1..-2]) => [1,2,3]
オブジェクト
m = {name: "woshidan", salary: 100};
m = name: "woshidan", salary: 100 m = name: "woshidan" salary: 100
m = { name: "woshidan", salary: { first: 100, second: 120 } }
m = name: "woshidan" salary: first: 100 second: 120
if文ほか
# block for if is presented by indent if score > 60 alert score # if the command is a single line, i can use `then` key word to put command onto the line. if score > 60 then alert score # cannnot use condition ? a : b in coffee script # when i want to write that expression, i can write as below. msg = if score > 60 then "OK" else "NG" 10 < i < 20 => 10 < i && i < 20
要素が配列やオブジェクトの中にあるかどうか.
alert "OK" if 5 in [10, 9, 8] # if (5 === 10 || 5 === 9 || 8 === 5) { # alert("OK"); # } # オブジェクトの場合はof alert "OK" if "score" of obj # 配列の後ろに条件を付け加えられる alert color for color in ["red", "blue", "pink"] when color isnt "blue" # ref = ["red", "blue", "pink"]; # for (i = 0, len = ref.length; i < len; i++) { # color = ref[i]; # if (color !== "blue") { # alert(color); # } } # item, i でindexも分かる(with_index的な) for key, value of obj command for item, index in array command
関数
# var greet = function () {} <= coffee script推薦 greet = function() alert "hi" # 字さげで
引数が無い時は()をつけて呼び出す。
引数のつけかたは矢印記号の前
greet = (name) -> alert "greet #{name}" greet "woshidan"
引数に初期値を与える
greet = (name = "woshidan") -> alert "greet #{name}" greet() #=> greet("woshidan")
即時関数
do -> alert "hello" # (function() { # alert "hello"; # })();
分割代入
[a,b,c] = [1,5,10]
alert a alert b alert c
=> 1, 5, 10
[x, y] = [y, x]
関数の戻り値でも
results = (x) -> [x, x 2, x3] [a, b, c] = results 5
オブジェクトから一部の要素を取り出す
user = name: "woshidan" score: 0 email: "woshidan@example.com"
{name, email} = user alert name alert email
クラス
class User var User; User = (function() { function User() {} return User; })(); # コンストラクターを書く class User constructor: (name) -> this.name = name # オブジェクトのthisは@で書ける class User constructor: (name) -> @name = name # オブジェクトのthis => @ # コンストラクターで代入をするだけの場合は以下のように書ける class User constructor: (@name) -> # 上と全く同じ意味だけど落ち着かない..!
継承はextend。 継承したクラスのコンストラクタを一部いじりたい場合は、 継承したクラスの生成コードの感じを覚えておくとよさそう。
AdminUser = (function(superClass) { extend(AdminUser, superClass); function AdminUser() { return AdminUser.__super__.constructor.apply(this, arguments); } return AdminUser; })(User);
存在演算子
null / undefined の時だけ false を返す
rs = if x? then "found" else "not found" var rs; rs = typeof x !== "undefined" && x !== null ? "found" : "not found";
rubyのtry(存在しなければnilを返して後の処理をしない)っぽいことができる
user = name: "woshidan" # alert user.score.first => タイプエラー # alert user.score?.first => undefined # メソッドだった場合は関数かどうかも判定 alert user.sleep?() # alert(typeof user.sleep === "function" ? user.sleep() : void 0);