instanceof判断的是左边对象的原型链上是否存在右边构造函数的prototype对象,核心是严格比对引用;执行时先取constructor.prototype,再沿obj.__proto__逐级向上查找,找到则返回true,直至null未找到则返回false。

instanceof 判断的是:左边对象的原型链上,是否存在右边构造函数的 prototype 对象。
核心过程是原型链逐级比对
执行 obj instanceof Constructor 时,JavaScript 引擎实际做三件事:
- 先取
Constructor.prototype—— 这是比对的“目标” - 再从
obj开始,沿着__proto__(或Object.getPrototypeOf(obj))向上找 - 每一步都检查当前原型是否 严格等于
Constructor.prototype(引用相等,不是值相等) - 找到就返回
true;走到null还没找到,就返回false
继承场景下为什么子类实例也 instanceof 父类
ES6 class 继承(如 class B extends A)会自动设置:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
B.prototype.__proto__ === A.prototype- 所以
new B()的原型链是:B.prototype → A.prototype → Object.prototype → null - 因此
new B() instanceof A为true,因为A.prototype确实在链上
哪些情况会让 instanceof 失效
它只认原型引用,不看名字、不自动装箱、不跨环境:
-
5 instanceof Number是false—— 数字是原始值,没有__proto__ -
new String('a') instanceof String是true,但'a' instanceof String是false - iframe 里的数组
arr,在父窗口中arr instanceof Array是false—— 因为两个Array.prototype不是同一个对象 - 手动重写
B.prototype = {}却没连上A.prototype,new B() instanceof A就变成false
别把它当万能类型检测工具
它解决的是“是否由某构造函数创建或继承自它”,不是“它到底是什么类型”:
- 判断数组优先用
Array.isArray() - 判断基本类型用
typeof - 需要精确类型标签可用
Object.prototype.toString.call(x) - 检测
null或undefined直接用===
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










