多くの開発者は最終的にこのコード行に出会います:
typeof null // "object"
そして反応は通常すぐに起こります:
「待って…何だ?」
なぜならnullはオブジェクトではありません
それは値の意図的な不在を表します
ではなぜJavaScriptがそれを識別するのでしょうか
調査が始まる
1990年代、JavaScriptエンジンはスピードとメモリ効率のために設計されていた
値は小さな32ビットメモリコンテナに格納されていた
値が何の種類かを迅速に識別するために、エンジンは隠れたバイナリマーカーであるtype tagsを使用していた
それらを内部証拠ラベルのようなものと考えることができる
以下のようなもの:
| タイプ | コンセプチュアルタグ |
|---|---|
| オブジェクト | 000 |
| 整数 | 001 |
| 文字列 | 010 |
| ブーリアン | 011 |
(簡略化されたコンセプチュアル表現)
重大な誤り
オブジェクトは内部でゼロベースのタイプパターンに関連付けられていました。
しかしnull には問題があった。
内部表現は基本的にすべてゼロだった:
00000000000000000000000000000000
だから、JavaScriptが値のタイプをチェックした時…
無意識にオブジェクトタグと一致させた。
エンジンは効果的に解釈した:
“すべてゼロ”
を:
「オブジェクト」
そして…
nullは誤検知されました.
なぜバグは修正されなかったのですか?
ミスがあちこちに広まっていたからです.
開発者が問題に気づいた時には、インターネット上のウェブサイトやアプリがすでにこの挙動に依存していました.
それを変更すると、既存の大量のコードが壊れる可能性がありました.
そのためバグは恒久的になりました.
デベロッパーの回避策
代わりに書くのではなく
typeof value === "object"
開発者は安全に確認する方法を学びました
value !== null && typeof value === "object"
追加の条件によりnullが抜け出すのを防がれます.
ケースを閉じる
このバグが魅力的なのは、誤った出力であるだけでない。
それは、JavaScriptの初期段階の小さな実装の詳細が…
数十年後の現代のアプリケーションでまだ生存しているという事実である。
一つの小さなミス。
一つの巨大な遺産。
一つ非常に奇妙な犯罪現場。
監視映像
完全な調査はTikTokで見られます:
証拠を確認
あなたが遭遇した最も奇妙なJavaScriptの挙動は何ですか?












