instanceof 判断基于原型链查找——从左操作数对象的__proto__开始向上遍历,若找到与右操作数构造函数的prototype严格相等的对象则返回true,否则false;数组 instanceof Object为true因Array.prototype.__proto__指向Object.prototype;原始值无原型链,故'hello' instanceof String等均为false。

原型链直接决定 instanceof 的判断结果——它不是看“值是什么类型”,而是看“这个对象的 __proto__ 链上有没有出现右边构造函数的 prototype”。
原型链查找是唯一判断依据
instanceof 内部只做一件事:从左操作数对象开始,沿着 Object.getPrototypeOf() 一路向上找,直到找到与右操作数构造函数的 prototype 严格相等的对象,或到达 null 为止。
- 匹配成功 → 返回
true - 走到头都没找到 → 返回
false
为什么数组 instanceof Object 也是 true
因为 Array.prototype 的 __proto__ 指向 Object.prototype,所以原型链是:[1,2].__proto__ → Array.prototype → Object.prototype → null
只要 Object.prototype 在链上,[1,2] instanceof Object 就为 true。这说明 instanceof 天然支持继承关系判断,不局限于“直接构造函数”。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
原型链被破坏时 instanceof 就会失效
以下情况会让原本该返回 true 的判断变成 false:
立即学习“Java免费学习笔记(深入)”;
- 手动重写
Foo.prototype = {}后没补constructor,虽不影响实例创建,但可能干扰某些依赖prototype结构的逻辑 - 显式切断原型链,如
obj.__proto__ = null - 跨 iframe 场景中,
iframe.contentWindow.Array !== Array,导致arr instanceof Array在主窗口返回false(两个Array.prototype不是同一个对象)
原始值永远过不了这一关
'hello' instanceof String 是 false,因为字符串字面量是原始值,没有原型链;它不会自动包装成对象,除非你显式调用 new String('hello')。
同理,42 instanceof Number、true instanceof Boolean 全是 false。原始值连 __proto__ 都没有,instanceof 根本无链可查。

















