1995年的一个内存优化决策,让全球开发者困惑了近三十年。

当你写下typeof null,返回值是"object"。但null不是对象,它代表"故意留空"。这个矛盾从JavaScript诞生第一天就存在,且永远无法修复。

打开网易新闻 查看精彩图片

问题出在32位内存容器的设计上。当年浏览器需要极速运行,引擎用隐藏的二进制标记(type tags)快速识别数据类型。对象被分配了以零开头的内部模式,而null的存储状态恰好是全零位:00000000000000000000000000000000。类型检测时,引擎把"全零"误读成了"对象"。

打开网易新闻 查看精彩图片

发现时已经太晚。1990年代末,这个行为已遍布互联网。修复意味着摧毁无数现有网站。于是它成了永久性bug——不是不能改,是改不起。

开发者被迫养成防御性习惯。判断对象前必须先过滤null:

value !== null && typeof value === "object"

打开网易新闻 查看精彩图片

这行代码至今仍在代码库中重复出现,成为一代程序员的肌肉记忆。

这个案例的吊诡之处在于:一个为了性能做出的微小妥协,反而制造了持续数十年的技术债务。早期JavaScript的设计哲学是"快而小",内存按位精打细算。没人预料到这门脚本语言会支撑起整个现代Web。

null的误判因此成为活化石——它提醒每个开发者,基础设施的脆弱性往往埋藏在最不起眼的实现细节里。你今天写的每一行代码,都可能成为未来某人的遗留负担。