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

null と undefined とは?

最終更新:
💡 どちらも値の不在に使うけれど、同じ値ではない

JavaScriptで、値の不在を扱うために使われる別々のプリミティブ値。undefinedは値を設定していない変数や存在しないプロパティなどで現れ、nullは対象がないことを明示するために使われる。どちらもコードから代入できる。

📌 このページのポイント
null と undefined:別々の値 let x = null; let y; 変数 x null 変数 y undefined 対象なしを明示 値を設定していない APIが返すこともある 自分で代入もできる null === undefined は false どちらもプリミティブ値。未宣言とは別
typeof null は歴史的な仕様で "object" ですが、null自体はオブジェクトではありません。
ひよこ ひよこ
どう違うの?
ペンギン先生 ペンギン先生
let x; の実行後のxや、存在しないプロパティの値はundefinedになるよ。nullは「対象なし」を明示する場面で使う。たとえばdocument.querySelectorは、要素が見つからなければnullを返すんだ。
ひよこ ひよこ
undefinedは自分で代入できないの?
ペンギン先生 ペンギン先生
代入できるよ。だから「人が入れたらnull、自動ならundefined」とは言い切れない。どちらを使うかはAPIやプログラムの約束によるんだ。宣言していない変数を普通に読み出すと、undefinedではなくReferenceErrorになるよ。
ひよこ ひよこ
どうやって見分けるの?
ペンギン先生 ペンギン先生
value === null と value === undefined で個別に比較できるよ。null === undefined はfalse。typeof undefined は "undefined" だけれど、typeof null は歴史的な仕様で "object" になる。null自体がオブジェクトという意味ではないんだ。
ひよこ ひよこ
値がないときに備える書き方はある?
ペンギン先生 ペンギン先生
JavaScriptの user?.name は、userがnullかundefinedならundefinedを返すよ。value ?? 代わりの値 は、その2つの場合だけ代わりを使う。0 ?? 10 は0のまま。if文では0や空文字列もfalse扱いになるので、値がないかの判定とは区別しよう。
ひよこ ひよこ
TypeScriptも助けてくれる?
ペンギン先生 ペンギン先生
strictNullChecksを有効にすると、nullやundefinedを別の型として扱うよ。たとえば検索結果がundefinedかもしれないのに、そのプロパティをすぐ読むと型エラーになる。値があることを確認してから使うなど、必要な処理をコードに表すんだ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
「null と undefined」って出てきたら「値の不在に使われる、JavaScriptの別々の値」と思えばだいたいOK!
📖 おまけ:英語の意味
「null / undefined」 = 対象がないこと / 未定義
💬 JavaScriptでは、どちらも独立したプリミティブ値として扱うよ。変数そのものを宣言していないこととは区別しよう。

参考資料

← 用語集にもどる