絕大多數開發者最終都會遇到這行程式碼:
typeof null // "object"
而反應通常是立即的:
“等…什麼?”
因為null不是一個物件。
它代表有意義地缺少一個值。
那麼為什麼 JavaScript 卻認為它是呢?
調查開始
回想起1990年代,JavaScript 引擎是為了速度和記憶體效率而設計的.
值被儲存在微小的32位元記憶體容器內.
為了快速識別正在儲存的值的類型,引擎使用了稱為型別標籤的隱藏二進位標記.
想像它們像是內部證據標籤。
類似於:
| 類型 | 概念標籤 |
|---|---|
| 物件 | 000 |
| 整數 | 001 |
| 字串 | 010 |
| 布林值 | 011 |
(簡化的概念表示)
關鍵性錯誤
物件在內部與零基數類型模式相關聯。
但是null 出現了問題。
它的內部表示基本上全都是零:
00000000000000000000000000000000
所以當 JavaScript 檢查值的類型時…
它意外地匹配了物件標籤。
引擎有效地解釋為:
“全都是零”
作為:
“物件”
而且…
null就被錯誤識別了.
為何錯誤未修正?
因為錯誤已蔓延到各處.
當開發者意識到問題時,互聯網上的網站和應用程式已經依賴這種行為.
改變它會導致大量現有程式碼失效。
所以這個錯誤變成了永久性的.
開發者的工作迴避方案
而不是寫:
typeof value === "object"
開發者學會了安全地檢查:
value !== null && typeof value === "object"
這個額外的條件防止null從中溜走.
關閉此案
這個錯誤令人著迷之處,不僅僅是錯誤的輸出。
它是這個事實:來自早期 JavaScript 的細微實現細節……
在數十年後仍然存活於現代應用程式中。
一個小錯誤。
一個巨大的遺產。
一個非常奇怪的犯罪現場。
監控影片
完整調查可在 TikTok 查看內容:
檢視證據
你遇到過最詭異的 JavaScript 行為是什麼?












