null と undefined は何が違いますか

undefined は「まだ値が入っていない」、null は「値が無いと決めて入れた」という違いを例で示す問い。?? と ?. の使い方、JSON にしたときの違いまで答えます。

答えてみる

面接官に「null と undefined は何が違いますか」と聞かれたつもりで、答えを見る前に自分の言葉で答えます。

声に出して答えた人は「書かずに答えを見る」で開けます。

解説を読む

聞かれ方から関連するコースまで、この問いの解説を全部ここに置いています。

こう聞かれます

  • 「null と undefined は何が違いますか」
  • 「値が無いことを表すとき、どちらを使いますか」
  • 「?? と || は、どう使い分けますか」

面接官が見ている点

  • 「どちらも空っぽ」で止めず、誰が入れた空なのかの違いを言えるか
  • 無い値を安全に扱う書き方 (?? と ?.) を知っているか
  • API や JSON でやり取りするときに、違いが表に出ることを分かっているか

短い答え

  • undefined は「まだ値が入っていない」状態で、宣言しただけの変数や、無いプロパティを読むと JavaScript が自動で返します。
  • null は「値が無い」と書き手が決めて入れる値で、「わざと空にした」ことを表します。
  • 無い値には ?? で既定の値を用意し、?. で安全に取り出します。JSON にすると undefined の欄は消え、null の欄は残る違いもあります。

少し詳しい答え

誰が入れた空か

利用者の情報で、あだ名の欄を「登録していない」と決めて null にした例です。年齢の欄はもともとありません。

JavaScript

let user = { name: "Aki", nickname: null };
console.log(user.nickname);
console.log(user.age);
console.log(typeof null);
console.log(typeof undefined);
console.log(JSON.stringify({ a: undefined, b: null }));
null
undefined
object
undefined
{"b":null}

無いプロパティを読むと、エラーにはならず undefined が返ります。null は書き手が入れた値なので、そのまま null が出ます。typeof null が object になるのは JavaScript の昔からの癖で、null がオブジェクトだという意味ではありません。null かどうかは value === null で調べます。

最後の行が、実務でいちばん差の出る所です。JSON に直すと undefined の欄は丸ごと消え、null の欄は残ります。API で「この欄を空にしたい」と送るつもりで undefined を入れると、欄そのものが届かず、サーバーは「変えない」と受け取ることがあります。空にしたいことを伝えるなら null を送ります。

?? と ?. で無い値を扱う

JavaScript

const count = 0;
console.log(count || 10);
console.log(count ?? 10);
const user = null;
console.log(user?.profile?.city);
console.log(user?.profile?.city ?? "未設定");
10
0
undefined
未設定

|| は 0 や空の文字列も「無い」と見て、右の値に置きかえます。件数が 0 件のときに 10 と出てしまうのはこのためです。?? は null と undefined のときだけ右の値を使うので、0 や空の文字列はそのまま残ります。

?. は、途中が null か undefined なら、エラーにせずそこで止めて undefined を返します。user.profile.city と書くと、user が null のときにエラーで処理が止まります。

チームでの決めと弱点

「わざと空にした」は null、「まだ無い」は undefined、と使い分けるチームが多い一方、どちらか 1 つにそろえるチームもあります。使い分けは意味を細かく伝えられますが、調べる側が両方を気にする手間が増えます。そろえると単純になりますが、「送らなかった」と「空にした」を区別したい API では足りなくなります。チームの決まりに合わせ、API の形を決めるときに、どちらを送るかを書いておきます。

TypeScript を使うと、string | null のように、null が入りうることを型で示せます。

よくある間違い

  • 「どちらも同じ空っぽ」と言う自動で入る空と、書き手が決めて入れる空の違いを言えると、扱い方の話につながります
  • 既定の値を || で入れて、0 や空の文字列を消してしまう null と undefined だけを置きかえたいときは ?? を使います
  • API で空にしたい欄に undefined を入れる JSON に直すと欄ごと消えて、相手に届きません。空にするなら null を送ります

深掘りの問い

  • 「関数が何も return しないと、何が返りますか」 undefined が返る、と答えます。引数を渡さなかったときの引数の中身も undefined です
  • 「?. を使いすぎると、何が困りますか」 本当は必ずあるはずの値が抜けていても気づかず、あとの別の場所で変な表示になることがあります。必ずある所はそのまま読み、無いとおかしい所はエラーにする、と答えます
  • 「DB の NULL と同じですか」 似ていますが別の物です。DB の NULL は「値が分からない」を表し、比べ方にも独自の決まりがある、と答えます

確認日 2026年10月24日

技術面接問題の一覧へ戻る