プロパティやメソッドを呼び出す際にレシーバーオブジェクトがnullでないことを確認した上で呼び出せる「?.」演算子の基本的な使い方を解説する。
※現在では、Web標準技術を利用したアプリ開発が広く普及し、そのためのフレームワークも多数存在しています。その中でも主流のフレームワークの1つである「Angular」を活用し、そのための知識を備えることには大きな意味があります。本連載は、Angularユーザーに向けて、その使いこなしTIPSを紹介するものです。なお、本連載は「Build Insider」で公開していた連載「Angular Tips」を同サイトおよび筆者の了解を得たうえで、本フォーラムに移行したものです。記事はBuild Insiderで公開した状態のまま移行しているため、用語統一などの基準が@ITの通常の記事とは異なる場合があります。
Angular 2/4対応。v2時点で執筆し、v4時点で内容を確認・検証しました。
別稿「TIPS:コンポーネントの値をビューに反映させるには?」では、{{...}}式では大概のJavaScript式が許容されていること、しかし、副作用を伴う演算子を中心に一部の機能は利用できないことを解説しました。
しかし、一方でビュー(テンプレート)でだけ利用できる特別な演算子もあります。それが「?.」演算子(Safe navigation operator)です。?.演算子を利用することで、プロパティ/メソッドを呼び出す際に、レシーバーオブジェクトがnullでないことを確認した上で呼び出すことができます。
まずは、?.演算子を使わない例から見ていきましょう。
import { Component } from '@angular/core';
@Component({
selector: 'app-root',
template: '<p>{{book.title}}</p>'
})
export class AppComponent {
book = {
title: 'AngularJSアプリケーションプログラミング',
price: 3700
};
}
では、太字の部分をコメントアウトした場合はどうでしょう。この場合、bookプロパティはundefined(未定義)になるので、「Cannot read property 'title' of undefined」のようなエラーが発生するはずです。undefined(未定義値)からtitleプロパティは読み込めない、というわけです。
もちろん、*ngIf*1のようなディレクティブであらかじめbookプロパティがundefined/nullでないかを確認することもできます。しかし、undefined/nullチェックの対象となるコードが増えてくれば、コードも冗長になりがちです。
そこで登場するのが、?.演算子なのです。
*1 条件式によって表示を切り替えるためのディレクティブです。後日、別稿で解説します。
先ほどの例で、templateパラメーターを以下のように書き換えてみましょう。コメントアウトしたbookプロパティはそのままとします。
template: '<p>{{book?.title}}</p>'
果たして、今度は例外が表示されなくなりました。?.演算子で、bookプロパティが空でないかどうかを確認し、空でない場合にだけtitleプロパティにアクセスするようになったからです。これがメンバーに「安全に」アクセスできる、といった意味です。
?.演算子は、例えばx?.y?.zのように、通常の.演算子と同じく、連結して利用することも可能です。
処理対象:テンプレート構文(Template Syntax) カテゴリ:基本
処理対象:?.演算子(Safe navigation operator) カテゴリ:テンプレート構文(Template Syntax)
API:NgIf(*ngIf) カテゴリ:@angular > common > DIRECTIVE(ディレクティブ)
Copyright© Digital Advantage Corp. All Rights Reserved.