instanceof 用于检测对象是否为某构造函数实例,通过查找对象原型链中是否包含该构造函数的 prototype;适用于数组、正则、date 等内置引用类型及自定义类,但跨 iframe 失效、不适用于原始值、受原型篡改影响。

instanceof 用于检测一个对象是否是某个构造函数的实例,它通过检查对象的原型链中是否包含该构造函数的 prototype 对象来工作。它不是万能的类型判断工具,但在明确构造上下文时,对引用类型的判断非常精准。
instanceof 的基本原理和用法
当执行 obj instanceof Constructor 时,JavaScript 引擎会沿着 obj.__proto__(即 Object.getPrototypeOf(obj))逐级向上查找,看能否找到 Constructor.prototype。只要在原型链中找到,就返回 true。
例如:
const arr = [1, 2, 3]; console.log(arr instanceof Array); // true<br> console.log(arr instanceof Object); // true(Array 原型链最终指向 Object)<br> console.log(arr instanceof RegExp); // false
判断常见内置引用类型(推荐场景)
对已知由标准构造函数创建的对象,instanceof 是语义清晰、可靠的判断方式:
-
数组:比
typeof arr === 'object'或Array.isArray()更具构造意图(尤其在自定义类继承Array时仍有效) -
正则表达式:
/abc/ instanceof RegExp比toString.call(re) === '[object RegExp]'更直观 -
Date、Error、Map、Set 等:如
new Date() instanceof Date,准确反映其构造来源 -
自定义类实例:对 class 定义的类型,
inst instanceof MyClass是标准且推荐的判断方式
需要注意的边界情况
instanceof 不是“类型检测”,而是“构造关系检测”,因此有几点必须注意:
-
跨 iframe / window 失效:不同全局环境中的
Array构造函数是不同的对象,iframe.contentWindow.Array !== Array,导致[].constructor === Array为false,instanceof返回false -
无法判断原始类型:
instanceof只适用于对象,对字符串字面量"a" instanceof String返回false(除非显式用new String("a")) -
原型被篡改时结果不可靠:若手动修改了对象的
__proto__或构造函数的prototype,判断可能失真
替代方案与组合建议
没有银弹,实际开发中常结合使用:
- 判断数组优先用
Array.isArray()(兼容性好、跨 frame 安全) - 判断 null/undefined/原始值,先用
typeof或严格相等 - 需要精确识别构造来源(如插件系统、序列化还原后验证)时,用
instanceof - 通用对象类型兜底可用
Object.prototype.toString.call(obj),如[object Map]
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











