instanceof用于判断对象是否在构造函数原型链上,本质是检查constructor.prototype是否存在于object.__proto__向上遍历的链中;返回布尔值,支持继承判断,但对原始值、跨iframe场景失效。

instanceof 用于判断一个对象是否在另一个构造函数的原型链上,本质是检查右操作数(构造函数)的 prototype 是否出现在左操作数(对象)的原型链中。
基本用法和原理
语法:object instanceof Constructor。JavaScript 引擎会沿着 object.__proto__ 逐级向上查找,直到找到与 Constructor.prototype 全等的对象,或到达原型链顶端(null)为止。
- 返回
true:说明Constructor.prototype是该对象原型链中的一环 - 返回
false:未找到匹配,或对象为null/undefined(此时直接报错或返回 false,取决于环境,但通常不建议对原始值使用)
常见有效场景
检测自定义类或内置构造器的实例:
-
new Date() instanceof Date→true -
new Array(1, 2) instanceof Array→true -
class Animal {}; const dog = new Animal(); dog instanceof Animal→true - 继承关系也成立:
class Dog extends Animal {}; new Dog() instanceof Animal→true
需要注意的边界情况
instanceof 不是万能的,有几类典型“失效”情形:
-
跨执行上下文无效:iframe 或 Worker 中创建的数组,用主页面的
Array检测会返回false,因为两个Array.prototype不同 -
原始值不适用:
"hello" instanceof String→false(字符串字面量不是String实例;new String("hello") instanceof String才是true) -
手动篡改原型链可能误导结果:比如
obj.__proto__ = Array.prototype,会导致obj instanceof Array为true,但它并非真正由Array构造
替代方案参考
若需更可靠地识别内置类型,可结合:
-
Object.prototype.toString.call(value)→ 返回[object Array]等标准字符串 -
Array.isArray()、Number.isInteger()等专用方法 - TypeScript 中类型守卫(如
value is T)更适合编译期校验
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











