まず「null」を一言でいうと
null は、
「ここには“何もない”ことを、あえてハッキリ示すための特別な値」 です。
「まだ値が決まっていない」のか
「値がないことをわざと示している」のか
この違いを表現したいときに使います。
ここが重要です。null は「意図的な空(から)」、undefined は「まだ何も決めていない・用意していない状態になってしまっている可能性が高い」と捉えると、使い分けが見えてきます。
null の基本:どう書く?どんな型?
そのまま書くだけのシンプルな値
null は、そのままキーワードとして使います。
let value = null;
console.log(value); // null
JavaScript"null"(文字列)ではなく、null(特殊な値)です。
typeof null が “object” になる罠
JavaScript では、typeof で型を調べることができますが、null を調べると、ちょっとややこしい結果が出ます。
console.log(typeof null); // "object"
JavaScript本来、null は独立した「null 型」として扱うべき存在ですが、
歴史的な事情で typeof では "object" が返ってきます。
これは JavaScript の有名な仕様バグで、
「そういうものだ」と覚えるしかありません。
ここが重要です。null は “object” ではありません。typeof null が "object" になるのは仕様上の欠陥であって、意味的には「値がない」という特別な状態です。
null と undefined の違いを感覚でつかむ
undefined は「まだ何も入っていない」状態
まず undefined を確認しましょう。
let x;
console.log(x); // undefined
JavaScriptこの x は、「変数としては存在するけれど、まだ値を入れていない」状態です。
JavaScript が自動的に undefined をセットしているイメージです。
関数でも同じです。
function hello() {
console.log("こんにちは");
}
let result = hello();
console.log(result); // undefined(何も return していない)
JavaScript「何も返していない」ことを undefined で表現しています。
null は「開発者が意図的に“空”を入れる」
これに対して、null は 自分で代入する値 です。
let user = null; // 今はユーザーはいない、と意図的に表現
// あとでログインしたら…
user = { name: "Taro" };
JavaScriptこの null には、「まだ何もないよ」と、
開発者が明示的に決めた意思 があります。
もし let user; のままだと、
「初期化し忘れているだけなのか」
「わざと空なのか」
がコードから読み取れません。
感覚的な対比
イメージで言うとこうです。
undefined
→ 部屋(変数)はあるけど、まだ何も運び込んでいない状態
→ 「準備不足」「まだ決まっていない」の匂いがするnull
→ 部屋はあるし、「今は何も置かない」と自分で決めて、空っぽにしている状態
→ 「今は空である」と意図的に決めたことが伝わる
ここが重要です。
「意図せず空になっている(かもしれない)」のが undefined、
「意図的に空にしている」のが null。
このニュアンスの違いを押さえると、どこで null を使うべきかが見えてきます。
実際の使いどころ:null を使う典型パターン
まだ値はないが、「あとで必ず何か入る」前提のとき
例えば、「ログインユーザー」という変数を考えてみます。
let currentUser = null; // 最初はログインしていない
// ログイン成功後
currentUser = { id: 1, name: "Taro" };
JavaScriptこの変数 currentUser は、
- ログインしていないとき →
null - ログインしているとき → ユーザーオブジェクト
という「2つの意味ある状態」を取ります。
もし let currentUser; とだけ書いておくと、
最初は undefined です。
この場合、
- 単に初期化し忘れている
- まだログイン処理が走っていない
の区別がつきません。
取得に失敗したときの「見つからなかった」表現
例えば、「ID からユーザーを探す」関数を考えます。
function findUserById(id) {
const users = [
{ id: 1, name: "Taro" },
{ id: 2, name: "Hanako" },
];
for (const user of users) {
if (user.id === id) {
return user;
}
}
return null; // 見つからなかった場合
}
JavaScript使う側はこう書きます。
const user = findUserById(3);
if (user === null) {
console.log("ユーザーが見つかりませんでした");
} else {
console.log("ユーザー名:", user.name);
}
JavaScriptここで undefined を返す設計にしてしまうと、
「関数のバグで return を忘れて undefined になった」のか
「仕様として見つからないときは undefined を返す」のか
が曖昧になります。
return null と書いておくことで、
「ここは意識的に“見つからなかった”を表現している」 ことが明確になります。
ここが重要です。
「値が存在しないこと自体に意味がある」場合、null を返す/代入することで、その意図をはっきりコードに刻み込める。
null をチェックする方法と注意点
シンプルな比較:=== null
null かどうかを調べるには、
厳密等価 === を使うのが基本です。
let value = null;
if (value === null) {
console.log("value は null です");
}
JavaScript== null と書くと、undefined の場合も true になってしまいます。
console.log(null == null); // true
console.log(undefined == null); // true(ここがややこしい)
JavaScriptなので、== null はおすすめしません。
null と undefined をまとめて扱いたいケース
「ここは null でも undefined でも“値なし”として扱っていい」
というケースでは、あえて両方をまとめて判定することもあります。
その場合はこういった書き方をします。
if (value == null) {
// value が null または undefined のどちらか
}
JavaScriptあるいは、厳密に両方見るなら:
if (value === null || value === undefined) {
// どちらにしても「意味のある値は入っていない」
}
JavaScriptここが重要です。
基本は === null でチェックする。
ただし、「null と undefined のどちらでも“値なし”とみなしたい」明確な意図があるときだけ、== null や複数条件で扱う。
null は falsy(条件式で false とみなされる)
if 文での挙動
null は Boolean の文脈(if など)では falsy として扱われます。
let value = null;
if (value) {
console.log("truthy");
} else {
console.log("falsy"); // こちらが実行される
}
JavaScriptBoolean(null) としても false です。
console.log(Boolean(null)); // false
JavaScriptつまり、null は
if (value)の条件では false と同じ扱いになる- ただし、
value === falseではない(型も値も違う)
という微妙な立ち位置です。
「値があるかどうか」をザックリチェックするパターン
よくある書き方として、
if (value) {
// value に何かしら値がある場合
} else {
// value が null / undefined / 0 / "" など「falsy」の場合
}
JavaScriptというものがあります。
この場合、null も「値がない側」に分類されます。
ただし、0 や ""(空文字)も falsy なので、
「0 も空文字も null も全部、“値なし”として扱っていいのか?」
をちゃんと考えながら使う必要があります。
ここが重要です。null は falsy なので、「ざっくり値あり/値なし」を判定するときに if の条件として便利だが、
“0 や空文字をどう扱うか” まで含めて意識しておかないと、意図しない分類をしてしまうことがある。
実務的な null の使い分けの感覚
1: 「まだロードされていない」「ロードしたけれど見つからなかった」を区別する
例えば、サーバーからデータを取得するようなアプリで、
let user = null;
let isLoading = true;
JavaScriptのように状態を持つとします。
処理の流れとしては、
- 最初:
user = null,isLoading = true
→ 「まだサーバーに取りに行っている最中」 - ロード成功:
user = {...},isLoading = false
→ 「ユーザー情報が手に入った」 - レスポンスが「ユーザーなし」だった場合:
user = null,isLoading = false
→ 「結果としてユーザーはいないことが分かった」
このように、
「まだ分からない(ロード中)」と
「調べた結果、いないと判明した」
をきちんと分けるためにも null はよく使われます。
2: 「オプション値」に使う
例えば、「ユーザーが任意でプロフィール文を書ける」ような仕様なら、
let profileMessage = null; // まだ書かれていない
// ユーザーが入力したら…
profileMessage = "よろしくお願いします!";
JavaScriptこうしておけば、
nullなら「書かれていない」- 文字列なら「何かしら書かれている」
と判定できます。
ここが重要です。
「値がないこと」に意味がある場面(未入力・未設定・見つからなかった・未選択など)では、null を積極的に使うと、状態の違いをきれいに表現できる。
初心者向け:null で本当に押さえてほしいこと
最後に、null についての本質的なポイントだけ整理します。
null は、開発者が「ここには意図的に何もない」と示すための特別な値。
undefined は「まだ何も入っていない」「用意されていない」状態を表すことが多く、null は「空であることを分かった上でそうしている」ニュアンスが強い。
typeof null は "object" と出るが、これは歴史的な仕様バグで、本質的には「値なし」を意味する独立した存在。
null かどうかを調べるときは、value === null を使う。== null は undefined も一緒に拾ってしまうので、意識して使う必要がある。
null は falsy(if の条件では false とみなされる)だが、false そのものではない。
ここが重要です。
「ここは未設定/未入力/未取得なので、あえて“何もない”と明示する」ときに null を使う。
逆に、“ただ単にまだ代入していないだけ” の変数が undefined になっているのは、バグの匂いがする。
この感覚を持っておくと、コードの設計もデバッグもぐっとしやすくなります。
もしよければ、小さな練習として、
let currentUser = null;
function login(name) {
currentUser = { name };
}
function logout() {
currentUser = null;
}
function showStatus() {
if (currentUser === null) {
console.log("ログインしていません");
} else {
console.log(`ログイン中: ${currentUser.name}`);
}
}
JavaScriptのようなコードを書いて、login("Taro") や logout() を呼び分けて showStatus() の結果を見てみてください。
「null を使うことで、ログインしている/していないという状態をどう表現しているか」が、
感覚としてかなりつかめてくるはずです。
