instanceof用于检测对象是否为某构造函数实例,本质是判断该构造函数的prototype是否在对象原型链上;它仅适用于引用类型,对float等原始类型无效。

instanceof 用于检测一个对象是否是某个构造函数的实例,本质是判断该构造函数的 prototype 是否出现在对象的原型链上。它**只适用于引用类型(对象)的归属检测**,对原始类型(如 string、number、boolean)无效。
instanceof 的基本用法和原理
语法:obj instanceof Constructor。JavaScript 引擎会沿着 obj.__proto__ 链向上查找,看是否能到达 Constructor.prototype。
- 如果找到,返回 true;否则返回 false
- 注意:必须是对象(包括数组、函数、日期、正则等),原始值直接调用会报错或恒为 false
- 例如:
[] instanceof Array→ true;{} instanceof Object→ true
常见引用类型的 instanceof 检测
以下类型均可通过对应内置构造函数准确识别:
当用户要求为 Java 代码添加注释、修改注释、审查注释、整理注释格式,或要求按照代码注释规范处理 Java 文件时,使用本技能。本技能用于统一生成和维护 Java 类注释模板、按 Git 对比 release 判断版本号、补充每行代码上方中文块注释、调整注释空行规则,并保持 Java 文件 UTF-8 无 BOM 编码。典型触发场景包括:补充类注释、更新 @version、检查 @author 来源、整理行尾注释、把注释放到代码上一行、检查注释是否符合规范、构建前检查 Java 注释风格。
-
[1, 2] instanceof Array→ true(区分普通对象) -
/abc/ instanceof RegExp→ true(比typeof更可靠) -
new Date() instanceof Date→ true -
function(){} instanceof Function→ true -
new Map() instanceof Map→ true(ES6+ 类型也支持)
需要注意的边界情况
instanceof 在跨执行上下文(如 iframe)中会失效,因为不同环境中的构造函数是独立的:
立即学习“Java免费学习笔记(深入)”;
- 在 iframe 中创建的数组,
arr instanceof Array在父页面中返回 false - 此时应改用
Array.isArray()或Object.prototype.toString.call(arr) - 自定义类同样适用:
new MyClass() instanceof MyClass→ true - 但
null和undefined不是对象,不能用 instanceof 检测
instanceof 与 typeof、Array.isArray 的对比
三者定位不同:
-
typeof:适合原始类型和函数,对大部分对象都返回"object" -
instanceof:适合已知构造函数的引用类型归属判断(有原型链依赖) -
Array.isArray()、Object.prototype.toString.call():更健壮,不受执行上下文影响

















