カテゴリー別アーカイブ: coffee-script

CoffeeScriptで変数に値が入っていない時にだけ代入する


前回の記事にCoffeeScriptでクエスチョンマークの利用方法に関して書いた。

クエスチョンマークはもっと使い方があって、例えば、
numという変数に値が入っていなかったら10を入れる
ということをしたいとき、クエスチョンマークの存在をしらなかったら

1
num = 10 unless num

のような書き方をするかもしれない。
でもこれは、!numとコンパイルされるので、numに0が入っている場合には代入が行われてしまい、「numに値がはいっていないときに代入」という条件には当てはまらない。

次のように書くこともできる

1
num = 10 unless num?

これは、コンパイルされると

1
2
3
if (typeof num === "undefined" || num === null) {
  num = 10;
}

というJavaScriptになる。
これなら要件を満たせるけど、CoffeeScriptはこんな書き方もできる。

1
num ?= 10

この書き方の時に注目したいのが、コンパイル結果

1
2
3
if (num == null) {
  num = 10;
}

一見、null判定しかしていないように見えるけど、「===」ではなく「==」を使っている。
つまり、numがundefinedでもnullでもtrueになる

CoffeeScriptにはJavaScriptの「==」が存在しないなんて断言しちゃいけない。。

rubyの「||=」と形が一緒で気に入った。

——————

ちなみに、

1
num = 10 if !num?

と書くと

1
2
3
if (num == null) {
  num = 10;
}

とコンパイルされる。
これは「?=」を使った時と同じ。
unless num?を使った時と違うのかー。