【ぬるとあんでふぁいんど】

null と undefined とは?

💡 「まだ届いてない郵便受け」と「空にした郵便受け」
📌 このページのポイント
null と undefined の違い null 「空っぽ」を意図的に代入 空の箱 (箱はある、中身がない) typeof → "object" let x = null; 開発者が「値なし」と明示 VS undefined 「まだ何も入っていない」 箱の準備中 (まだ何も設定されていない) typeof → "undefined" let y; システムが自動で付与 共通点: どちらも == で比較すると true(null == undefined)
null/undefinedの違いのイメージ
ひよこ ひよこ

なんで「値がない」を表すものが2つもあるの?

ペンギン先生 ペンギン先生

JavaScriptの設計上の歴史的な事情。undefined は「まだ何も入れてないよ」というシステム側のデフォルト値、null は「ここには意図的に何も入っていません」というプログラマの意思表示。使い分けを意識するとコードが読みやすくなる。

ひよこ ひよこ

typeof null が "object" になるのはなぜ?

ペンギン先生 ペンギン先生

これはJavaScriptの初期実装のバグが仕様としてそのまま残ったもの。本来は "null" を返すべきだった。互換性のために修正されていない。null かどうか調べるには value === null と厳密比較するのが安全。

ひよこ ひよこ

おもしろい!null チェックってどうやるの?

ペンギン先生 ペンギン先生

value === null や value === undefined で個別にチェックできる。両方まとめてチェックしたいなら value == null とすると null と undefined の両方にマッチする。TypeScriptならオプショナルチェーン(?.)でさらに安全に書ける。

ひよこ ひよこ

TypeScriptだとnullとundefinedはどう扱うの?

ペンギン先生 ペンギン先生

TypeScriptのstrictNullChecksを有効にすると、null/undefinedの可能性がある変数にアクセスするときにコンパイルエラーが出るようになるんだ。「string | null」のように型で明示的に宣言する必要がある。これでnull参照のバグが激減するよ。

ひよこ ひよこ

他の言語だとnullってどう扱われてるの?

ペンギン先生 ペンギン先生

Javaでnullにアクセスすると有名な「NullPointerException」が飛ぶし、Javaの設計者ホーアさん自身がnullを「10億ドルの間違い」と呼んでいるよ。最近の言語ではRustのOption型やKotlinのnull安全型のように、nullが存在しない設計が主流になりつつあるんだ。

ペンギン
まとめ:ざっくりこれだけ覚えればOK!
null と undefined って出てきたら「どちらも値がない状態だけど、意図的かどうかが違う」と思えばだいたいOK!
📖 おまけ:英語の意味
「null / undefined」 = 無効 / 未定義
💬 null はラテン語の「nullus(何もない)」、undefined は「定義されていない」という英語そのまま
← 用語集にもどる