1. links と url がそろっている
  2. links はあるが url が無い
  3. links そのものが無い
  4. work が null でもエラーにしない
  5. 別の作品でも取り出せる
コース一覧
JavaScript基礎文法:処理を組み立てる
?. で安全に取り出す

JavaScript基礎文法:処理を組み立てる

if・switch による条件分岐、配列とループ、関数とコールバック、オブジェクトを順に組み立てる全 33 レッスン(525 分)の基礎文法コースです。FizzBuzz、作品リスト、関数への整理、作品データの構造化を通して、入力から結果を返す処理を自分で分解して書きます。DOM 操作は次のコースで扱います。

1
条件分岐
01. if 文の基本15分
02. if / else if / else で段階判定15分
03. switch 文で値を一覧から選ぶ15分
04. 条件を組み合わせる20分
05. FizzBuzz で複数条件を組み立てる20分
06. つくる 時間帯で挨拶を変える20分
07. 第1章まとめクイズ10分
2
配列とループ
01. 配列のきほん15分
02. 要素を足す・取り除く15分
03. for ループで合計を求める15分
04. for-of で配列を走査する15分
05. while で条件を満たす間くり返す15分
06. break と continue でループを制御する15分
07. つくる 作品リストを一覧にする20分
08. 第2章まとめクイズ10分
3
関数
01. 関数宣言15分
02. アロー関数15分
03. デフォルト引数15分
04. 早期 return でネストを浅くする15分
05. 変数のスコープ15分
06. コールバック関数15分
07. forEach で配列をまわす15分
08. つくる 処理を関数に整理する20分
09. 第3章まとめクイズ10分
4
オブジェクト
01. オブジェクトのきほん18分
02. オブジェクトで複数の値を返す16分
03. const と参照18分
04. ?. で安全に取り出す16分
05. 分割代入18分
06. スプレッド構文18分
07. find と includes で探す16分
08. つくる 作品データを構造化する25分
09. 第4章まとめクイズ10分

?. で安全に取り出す

オプショナルチェーン
解説

このレッスンで分かること

  • obj?.prop は左が null か undefined のとき、そこで打ち切って undefined を返します
  • 使うのは「無いことが正常」な場所だけにします

1 つ手前が空だっただけで、プログラムが止まる

オブジェクトの中にオブジェクトを入れると、途中の階層が無いという状態が起こります。

JavaScript

const author = { name: "山田 太郎" }; console.log(author.contact.email); // TypeError: Cannot read properties of undefined (reading 'email')

author.contact は存在しないので undefined です。その undefined からさらに .email を読もうとした瞬間、例外が投げられて止まります。

このエラーで読むべきなのは reading 'email' の部分ではなく、of undefined の部分です。犯人は email ではなく、その 1 つ手前の contact だからです。読もうとしたキーの名前ではなく、その手前が空だった、と読み替えるのがコツです。

?. が使えるようになる前は、階層の数だけ && を並べていました。

JavaScript

const email = author && author.contact && author.contact.email;

?. は左が空なら、そこで打ち切る

同じことが 1 行で書けます。

JavaScript

const email = author?.contact?.email; console.log(email); // undefined エラーにはならない

読み方は「左が null か undefined なら、そこで打ち切って undefined を返す。そうでなければ普通にプロパティを読む」です。

書き方author が空のときauthor.contact が無いとき
author.contact.email止まる止まる
author && author.contact && author.contact.emailundefinedundefined
author?.contact?.emailundefinedundefined

?. が反応するのは null と undefined の 2 つだけです。0 や "" や false は「ある」と扱われて先へ進みます。判定の基準が ?? とまったく同じなので、この 2 つは組で使えます。

JavaScript

const shown = author?.contact?.email ?? "未公開";

?. の結果は undefined になることがあり、そのまま画面に出すと「undefined」という文字が表示されてしまいます。既定値を添えるのが定石です。

どこに使い、どこに使わないか

便利だからといって、すべての . を ?. に置き換えるのは行き過ぎです。何を渡しても静かに undefined が返るようになり、本来ならエラーで気付けたはずの不具合が、画面に「undefined」と出るまで表面化しなくなります。

?. を使うのは、無いことが正常な値に限ります。まだ公開していない作品に URL が無いのは当たり前なので ?. が向いています。一方で題名は必ずあるべき値なので、無いなら気付けたほうが良いのです。外から来たデータ、ユーザーの入力、設定ファイルのように、自分で作っていない値の入り口が主な出番です。

よくある間違い

  • ?. を置く位置が 1 つ後ろ — author.contact?.email では、author 自体が undefined のときに結局止まります。守るのは読む対象ではなく、その手前です
  • 代入の左側で使おうとする — ?. は読み取り専用の記号です。author?.contact.email = "..." は構文エラーになります

要件

  1. 関数名は getWorkUrl、引数は work の 1 つ
  2. work.links.url の値を返すこと
  3. work が null のときも work.links が無いときもエラーにしないこと
  4. 取り出せないときの戻り値は undefined にすること

入出力例

getWorkUrl({"links":{"url":"https://example.com/profile"},"title":"プロフィールサイト"}) → "https://example.com/profile" getWorkUrl({"links":{},"title":"自己紹介カード"}) → null getWorkUrl({"title":"スキル一覧の表"}) → null getWorkUrl(null) → null getWorkUrl({"links":{"url":"https://example.com/card"},"title":"自己紹介カード"}) → "https://example.com/card"

ヒント

危ないのは `work` と `work.links` の 2 か所です。その直後に `?.` を置きます

答えは `return work?.links?.url;` の 1 行です。`if` での場合分けは要りません

`work.links?.url` だと `work` 自体が `null` のときに TypeError になります。守る位置に注意してください

生田 陸人
監修生田 陸人
ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

関連レッスン

  • 分割代入

    オブジェクトや配列から必要な値をまとめて変数に取り出す書き方です。既定値や名前の付け替えもできます。

  • スプレッド構文

    ... で配列やオブジェクトの中身を展開する書き方です。元を壊さずにコピーや合成ができます。

  • find と includes で探す

    配列から条件に合う要素を探す道具です。値が欲しいのか位置が欲しいのか有無だけでよいのかで使い分けます。

  • つくる 作品データを構造化する

    第 7 章の総仕上げです。作品オブジェクトの配列から件数と合計閲覧数と最新作をまとめた集計結果を返します。

このレッスンに出てくる用語

意味があいまいなまま進んだ語は、ここから読み直せます。

  • オブジェクトキーと値のペアで構造を作るデータ
  • 階層ネットワークを役割ごとに積み重ねた構造
  • プロパティメソッドを属性のようにアクセスできるようにするデコレータ。
  • URLページの住所全体
  • 関数処理に名前を付けて再利用できる単位
  • 引数位置引数=順番で渡す。
  • 戻り値呼び出し元への返答を表す点線矢印
main.js
学習モード
エディタを読み込んでいます

メモ

?. で安全に取り出す

⌘S で保存