instanceof用于判断对象是否在构造函数原型链上,本质是检查右操作数的prototype是否存在于左操作数的__proto__链中;沿obj.__proto__逐级向上比对Constructor.prototype,找到则返回true,否则false。

instanceof 用于判断一个对象是否在另一个构造函数的原型链上,本质是检查右操作数(构造函数)的 prototype 是否出现在左操作数(对象)的原型链中。
基本用法和原理
语法:obj instanceof Constructor。引擎会沿着 obj.__proto__ 逐级向上查找,看是否等于 Constructor.prototype 或其任意上级原型。
- 如果找到匹配,返回
true;否则返回false - 要求右操作数必须是函数且具有
prototype属性,否则抛出TypeError - 对
null和undefined总是返回false(它们没有原型链)
常见使用场景
检测内置类型或自定义类的实例:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
[] instanceof Array→true -
new Date() instanceof Date→true -
function Person() {},new Person() instanceof Person→true - 继承关系也生效:
class Child extends Parent {},new Child() instanceof Parent→true
需要注意的边界情况
instanceof 不是绝对可靠的类型判断工具:
立即学习“Java免费学习笔记(深入)”;
- 跨 iframe 或不同执行上下文创建的对象,原型链断裂,
instanceof会返回false(例如 iframe 中的[] instanceof Array可能为false) - 手动修改
__proto__或替换原型可能影响结果,但不推荐这样做 - 不能用于原始值:
42 instanceof Number→false(42是原始值,不是对象);包装对象才行:new Number(42) instanceof Number→true
替代方案参考
若需更健壮的类型识别,可结合:
-
Object.prototype.toString.call(value)获取内部 [[Class]] 标签,如[object Array] -
Array.isArray()、Number.isNaN()等专用方法 - TypeScript 类型守卫(编译期)或运行时类型检查库

















