【入門編】 typeof nullがobjectである歴史的背景 – JavaScript実践ガイド

こんにちは!フロントエンドの現場を渡り歩いているチーフアーキテクトの私です。

JavaScriptを触り始めてすぐの頃、またはある程度コードを書けるようになってふと出会う、あの有名な「JavaScriptの七不思議」の一つ。そう、`typeof null` がなぜか `”object”` になってしまうという現象。

「えっ、`null` って何もない空っぽの状態を表す値だよね? なんでオブジェクトなの?」

そう頭を抱えて、そっとブラウザのタブを閉じたくなる気持ち、ものすごくよく分かります。私も駆け出しの頃に「JavaScript、なんていい加減な言語なんだ…」と遠い目をした記憶があります。

でも、大丈夫ですよ。あなたが混乱しているのは、あなたの理解力が足りないからでも、JavaScriptが気まぐれだからでもありません。これには、インターネットの歴史を少しだけ遡る「切ない理由」があるのです。

今回は、この「`typeof null` が object になる謎」について、歴史の裏側を覗き見つつ、現場で私たちがどうやってこのバグ(仕様)と付き合っていけばいいのかを、温かく紐解いていきましょう。

—

そもそも `typeof` ってなに?

JavaScriptには、今扱っているデータが「文字なのか、数字なのか、それとも物(オブジェクト)なのか」を調べるための `typeof` という便利な演算子があります。

身の回りの例えで言うなら、スーパーのレジでバーコードをピッと当てたときに、「これはお肉です」「これはお惣菜です」と判別してくれる機械のようなものです。

基本的には、こんな風に綺麗に分類してくれます。

// 数字を調べると “number” が返る
console.log(typeof 42); // “number”

// 文字列を調べると “string” が返る
console.log(typeof “こんにちは”); // “string”

// 真偽値(true/false)を調べると “boolean” が返る
console.log(typeof true); // “boolean”

ここまでは「お、優秀じゃん!」と思いますよね。ところが、この子には一つだけ、生まれてからずっと直っていない「愛すべき(そして厄介な)お茶目な癖」があるのです。それが `null` に対する判定です。

// 「何もない」を表す null を調べると…
console.log(typeof null); // “object” (なぜ!?)

そう、ここに「空っぽ」を入れたはずなのに、返ってきた答えは「オブジェクト(ひとまとまりのデータ)」なんです。お皿の上を覗き込んだら、何も乗っていないのに「お皿という物体です」と言われているような違和感がありますよね。

—

なぜこんなことが起きたのか?(歴史的背景という名のタイムカプセル)

この奇妙な現象の正体は、JavaScriptが生まれた1995年の遠い昔に隠されています。

当時、JavaScriptはネットスケープ社(Netscape)のBrendan Eich(ブレンダン・アイク)氏によって、なんとたった10日間という驚異的なスピードで作り上げられました。

その初期のJavaScriptにおいて、すべてのデータはコンピュータのメモリ上で「型情報(それが何であるかを示すタグ)」と「実際の値」のペアとして記録されていました。

当時の実装では、データの種類を判別するために「タグ番号」のようなものが割り振られていました。

  • 数字なら `000`
  • 文字列なら `1桁の何か`
  • オブジェクトなら `000` から始まる特定のパターン……

そして、「何もない」を表す `null` は、コンピュータのメモリの世界では「アドレスが存在しない(ゼロ=0)」という意味を込めて、機械語の `NULLポインタ(すべてが0のビット列)` として表現されていました。

お気づきでしょうか?
当時のJavaScriptのエンジンは、「あれ、このデータのタグ番号、全部ゼロ(`0`)だな。ということは、これはオブジェクトの仲間だな!」 と、盛大に勘違いしてしまったのです。

`null` は「何もない(値がない)」という意味なのに、メモリの仕組み上「ゼロ=オブジェクトの分類に入っちゃう!」という判定になってしまいました。

直せなかったの?

「じゃあ、後から直せばよかったじゃない!」と思いますよね。私もそう思います。

しかし、JavaScriptが世界中で使われるようになり、膨大な数のWebサイトがこの言語で作られてしまった後では、この判定方法を修正することができなくなってしまいました。

もしある日突然、JavaScriptの偉い人たちが「やっぱり `typeof null` は `“null”` に直しますね!」とアップデートしたらどうなるでしょう? 世界中の古いプログラムが一斉に動かなくなり、インターネット中が大パニックになってしまいます。

そのため、「過去の互換性を壊さない(昔作ったWebサイトが動かなくなってはいけない)ため、この仕様(バグ)は永遠にそのまま残す」という選択がなされたのです。これが、今日まで `typeof null === ‘object’` が生き残っている理由です。歴史の重みですね。

—

実務ではどうやって対処すればいいの?

さて、理由が分かったところで、私たちWeb制作やアプリ開発の現場に生きる人間にとって大切なのは、「じゃあ、どうやって安全にコードを書けばいいの?」という実践的なお話です。

もしあなたが「この変数がちゃんと中身を持っている(空っぽの `null` ではない)」ということを正確に調べたいとき、`typeof` をそのまま使ってしまうと、`null` をオブジェクト(有効なデータ)だと誤認してしまいます。

ここで、実務で使えるスマートな対処法を2つご紹介します。

対処法1:`null` を直接比較する

一番確実で、現場でもよく使われる方法です。`typeof` に頼らず、「そもそも `null` そのものかどうか」を `===` で直接チェックします。

// ユーザーの入力データをイメージしてみましょう
let userInput = null;

// まず null かどうかをピンポイントで弾く
if (userInput === null) {
console.log(“データは入っていません(空っぽです)”);
} else {
console.log(“データが存在します!”);
}

対処法2:JavaScriptの「ちょっと特殊な性質」を利用する

実は、JavaScriptにはもう一つの「何もない」を表す `undefined` という値もあります。
「`null` も `undefined` もまとめて『中身がない』として弾きたい!」というときは、条件分岐の中でこんな書き方をよく使います。

let responseData = null;

// null や undefined は、if文の条件式に入れると自動的に false(偽)として扱われます!
if (responseData) {
// 中身がある場合の処理
console.log(“有効なデータがあります:”, responseData);
} else {
// null や undefined、空文字などの場合
console.log(“中身が空っぽ、または未定義です。”);
}

※ただし、この方法は `0` や空文字 `””` も `false` として判定されてしまうため、「数字の `0` は有効なデータとして扱いたい!」という場合には使えません。用途に合わせて使い分けるのがプロの技です。

—

まとめ

いかがでしたでしょうか?

  • `typeof null` が `”object”` になるのは、JavaScript黎明期の10日間で作られた歴史的バグ(名残)。
  • 世界中のプログラムを壊さないために、今でもあえてそのままにされている。
  • 実務では、`typeof` だけで判定せず、`=== null` で直接チェックしたり、安全な条件分岐を心がけたりするのが鉄則。

JavaScriptには、こうした「ちょっとクスッと笑ってしまう歴史」がまだまだたくさん隠されています。でも、その理由を知るだけで、なんだか言語に対する愛着が少し湧いてきませんか?

もしまたコードを書いていて「なんだこれ変だな?」と思ったら、それはあなたが未熟なせいではなく、歴史のロマンにぶつかっているだけかもしれません。
その時は、ぜひ今回の話を思い出して、肩の力を抜いてコードに向き合ってみてくださいね。

あなたのフロントエンド開発ライフが、少しでも楽しく、軽やかなものになりますように。応援しています!

コメント

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