連続して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 になるのかー。
便利な書き方です。