null是原型链的明确终止标记,表示“没有上一级原型”,是属性查找的硬性终点;object.prototype.__proto__ === null保证了链式查找有限、可预测且不陷入循环。

null 在 JavaScript 原型链中不是“错误值”或“占位符”,而是明确的**终止标记**——它表示“没有上一级原型”,是引擎属性查找流程的硬性终点。
它本质是查找机制的设计锚点
当访问 obj.toString() 时,引擎按顺序检查:
- obj 自身有没有
toString - 没有?查
obj.__proto__(即它的原型) - 还没找到?继续查
obj.__proto__.__proto__ - 直到某次查到
null—— 此时停止,抛出undefined或触发默认行为(如调用Object.prototype.toString)
这个过程依赖 null 提供确定的边界。若不设终点,引擎可能陷入无限递归或循环引用(比如误配原型导致 A → B → A)。
它反映对象模型的底层一致性
所有普通对象({}、[]、new Date() 等)最终都连向 Object.prototype,而 Object.prototype.__proto__ === null 是唯一打破链式结构的节点。这保证了:
- 任意对象的原型链长度有限
- 所有对象共享同一套基础能力(如
hasOwnProperty、valueOf),因为它们都直接或间接继承自Object.prototype -
null本身没有原型,也不参与任何继承,是整个对象系统的“地基之下”
它不是空对象,也不是未定义
null 和 undefined 语义不同:
-
undefined表示“尚未赋值”或“属性不存在” -
null表示“明确指向无”——原型链走到这里,就是真的到底了,再往上没有意义
这也是为什么 Object.getPrototypeOf(Object.prototype) 返回 null,而不是 undefined:这是设计上的主动截断,而非缺失。
它支撑了 JavaScript 的轻量继承模型
没有类系统、没有编译期类型检查,JavaScript 靠运行时原型链实现复用。而 null 让这套动态查找变得可预测、可终止、可调试。你可以用一行代码验证:
console.log(Object.getPrototypeOf(Object.prototype)) // null
这不是巧合,是引擎必须遵守的契约。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











