JavaScript | 基礎構文:データ型 – Null

JavaScript
スポンサーリンク

まず「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"); // こちらが実行される
}
JavaScript

Boolean(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

のように状態を持つとします。

処理の流れとしては、

  1. 最初:user = null, isLoading = true
    → 「まだサーバーに取りに行っている最中」
  2. ロード成功:user = {...}, isLoading = false
    → 「ユーザー情報が手に入った」
  3. レスポンスが「ユーザーなし」だった場合:user = null, isLoading = false
    → 「結果としてユーザーはいないことが分かった」

このように、

「まだ分からない(ロード中)」と
「調べた結果、いないと判明した」

をきちんと分けるためにも null はよく使われます。

2: 「オプション値」に使う

例えば、「ユーザーが任意でプロフィール文を書ける」ような仕様なら、

let profileMessage = null; // まだ書かれていない

// ユーザーが入力したら…
profileMessage = "よろしくお願いします!";
JavaScript

こうしておけば、

  • null なら「書かれていない」
  • 文字列なら「何かしら書かれている」

と判定できます。

ここが重要です。
「値がないこと」に意味がある場面(未入力・未設定・見つからなかった・未選択など)では、
null を積極的に使うと、状態の違いをきれいに表現できる。


初心者向け:null で本当に押さえてほしいこと

最後に、null についての本質的なポイントだけ整理します。

null は、開発者が「ここには意図的に何もない」と示すための特別な値。

undefined は「まだ何も入っていない」「用意されていない」状態を表すことが多く、
null は「空であることを分かった上でそうしている」ニュアンスが強い。

typeof null"object" と出るが、これは歴史的な仕様バグで、本質的には「値なし」を意味する独立した存在。

null かどうかを調べるときは、value === null を使う。
== nullundefined も一緒に拾ってしまうので、意識して使う必要がある。

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 を使うことで、ログインしている/していないという状態をどう表現しているか」が、
感覚としてかなりつかめてくるはずです。

タイトルとURLをコピーしました