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

CoffeeScript 存在チェックのチェーン


連続してCoffeeScriptの ? について記事を書いているけど、これが最後になると思う。

こんな適当なCoffeeScriptコードがあるとする。

1
hogehoge.hoge1.hoge2.hoge3();

hoge3に到達する前に、hoge1とかhoge2がnullとかundefinedだとエラーになっちゃう。
これを回避するために、次のように書ける。

1
hogehoge?.hoge1?.hoge2?.hoge3?();

コンパイルした結果はこちら

1
2
3
4
5
6
7
8
9
10
11
var _ref, _ref1;

if (typeof hogehoge !== "undefined" && hogehoge !== null) {
  if ((_ref = hogehoge.hoge1) != null) {
    if ((_ref1 = _ref.hoge2) != null) {
      if (typeof _ref1.hoge3 === "function") {
        _ref1.hoge3();
      }
    }
  }
}

なんだか複雑なことになってるけど、つまりは、
hogehogeが存在してhoge1が存在してhoge2が存在してhoge3が関数ならばhoge3を実行する。
ということになっている。
文章で説明するより、CoffeeScriptを見て意味を直感で納得しよう。

————————

結果を変数に代入する場合だとどうなるのか。
こういうCoffeeScript

1
result = hogehoge?.hoge1?.hoge2?.hoge3?()

コンパイルした結果はこちら

1
2
3
var result, _ref, _ref1;

result = typeof hogehoge !== "undefined" && hogehoge !== null ? (_ref = hogehoge.hoge1) != null ? (_ref1 = _ref.hoge2) != null ? typeof _ref1.hoge3 === "function" ? _ref1.hoge3() : void 0 : void 0 : void 0 : void 0;

ぱっと見さっぱりわからん!

だけどよく見てみると、hogehoge、hoge1、hoge2、hoge3のどれかが存在しない場合には、void 0 が result に代入されるんだということがわかる。
つまり、undefined になるのかー。

便利な書き方です。