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

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

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

hogehoge.hoge1.hoge2.hoge3();

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

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

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

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

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

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

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 になるのかー。

便利な書き方です。

タイトルとURLをコピーしました