JavaScript における undefined と null の違い

基本的な意味

undefined

「値が定義されていない」状態。変数を宣言したが、まだ値を代入していないときに自動的に設定される。JavaScript の内部で「何も代入されていない」という初期状態を示す。

null

「値が存在しない」ことを意図的に表す。開発者が「ここには何もない」と明示的に代入するために使う。オブジェクトが存在しない場合などにも使われる。

undefined は undefined 型、null は object 型(歴史的仕様による誤りだがそのまま)
代入undefined は通常自動で設定され、開発者が代入することはまれ
意図null は「意図的な空」、undefined は「まだ何も設定されていない」
等価比較null == undefined は true、だが厳密比較(===)では false
JSONJSON.stringify(undefined) はキーごと削除されるが、JSON.stringify(null) は "null" として残る

let a
console.log(a)          // undefined(まだ代入されていない)

let b = null
console.log(b)          // null(意図的に空を代入)

console.log(a == b)     // true(ゆるい等価)
console.log(a === b)    // false(型が異なる)

使い分けの指針

変数がまだ初期化されていない場合は undefined(自動)
意図的に「何もない」ことを表したい場合は null
API やデータ構造の戻り値として「結果が存在しない」ことを示すときは null