instanceof 是 JavaScript 里面的二元运算符,作用是检测左边对象的原型链上,是否存在右边构造函数的 prototype 属性,检测成功返回 true,检测失败返回 false,它主要用来判断对象是否属于某个构造函数或者类的实例,注意 instanceof不能准确判断原始基本类型,比如数字 字符串 布尔值这种基础类型,使用 instanceof 一般会返回 false,它的核心原理是沿着原型链向上查找,所以只要原型链上匹配到构造函数的 prototype,就判定为实例,这也是它和 typeof 最大区别,面试和前端开发高频考点,经常结合类继承 内置对象 判断 跨窗口原型问题考察,下面把语法 原理 示例 边界坑点深度归纳。
基础语法
表达式写法
对象 instanceof 构造函数
返回值:布尔值 true 或者 false
| 对比项 | instanceof | typeof |
|---|---|---|
| 判断目标 | 对象实例 原型链 | 数据类型 |
| 原始值 | 基本类型一般 false | 可以识别 number string 等 |
| 继承 | 支持原型链继承判断 | 不识别继承关系 |
| 数组判断 | arr instanceof Array 返回 true | typeof arr 返回 object |
基础示例
function Person(){}
const p = new Person()
console.log(p instanceof Person) // true
内置对象示例
const arr = []
console.log(arr instanceof Array) // true
console.log(arr instanceof Object) // true
这里重点,数组原型链同时指向 Array 和 Object,所以 arr instanceof Object 结果也是 true,因为 Array.prototype 本身继承自 Object.prototype,这就是原型链向上查找的特点。
类继承示例
class Animal{}
class Dog extends Animal{}
const d = new Dog()
console.log(d instanceof Dog) // true
console.log(d instanceof Animal) // true
子类实例,既属于子类,也属于父类,instanceof 会沿着原型链找到父类 prototype。
核心执行原理
1 读取右边构造函数的 prototype
2 拿左边对象的__proto__,沿着原型链一层层向上查找
3 如果某一层原型等于右边 prototype,返回 true
4 一直找到原型链终点 null,仍然没有匹配,返回 false
重要边界与坑点
第一 原始基本类型不能用 instanceof 判断
const num = 123
console.log(num instanceof Number) // false
因为 123 是原始值,不是 Number 构造函数实例,只有 new Number (123) 这种包装对象才会返回 true,日常开发不要用 instanceof 判断基础类型。
第二 跨 iframe 跨窗口原型失效
不同 iframe 里面的 Array 构造函数不是同一个引用,在 A 窗口创建的数组,放到 B 窗口执行 arr instanceof Array 会返回 false,这是经典坑,这种场景推荐使用 Array.isArray。
第三 手动修改 prototype 会改变 instanceof 结果
如果修改构造函数的 prototype 指向,instanceof 判断结果会跟着变化,因为它判断的是当前 prototype 引用。
第四 null 和 undefined 不能使用 instanceof,执行会报错。
常见使用场景
1 判断是否是数组 自定义类实例
2 多态场景,判断实例是否属于父类
3 类继承体系校验
替代方案
判断数组优先 Array.isArray (arr),比 instanceof 更稳定,不受跨窗口影响。
判断类型也可以使用 Object.prototype.toString.call (),可以精准区分原始类型和内置对象。
【常见问题】
问题 1 instanceof 用法 为什么 arr instanceof Object 是 true
回答 1 instanceof 用法核心是原型链向上查找,数组原型链上 Array.prototype 最终继承 Object.prototype,所以 arr instanceof Object 返回 true,这是 instanceof 用法的正常特性,不是代码错误。
问题 2 instanceof 用法 可以判断数字字符串原始值吗
回答 1 instanceof 用法不适合原始基本类型,数字字符串这种原始值执行 instanceof Number 或者 String 会返回 false,只有 new Number 包装对象才会匹配,判断原始类型优先使用 typeof。
问题 3 instanceof 用法 跨 iframe 为什么判断数组失效
回答 1 instanceof 用法依赖构造函数 prototype 引用,不同 iframe 的 Array 构造函数是独立引用,跨窗口实例原型不属于当前窗口 Array.prototype,所以 instanceof 用法判断会失效,推荐改用 Array.isArray。
问题 4 instanceof 用法 子类实例为什么同时匹配父类
回答 1 instanceof 用法会沿着原型链向上遍历,class extends 继承之后子类实例原型链包含父类 prototype,所以子类实例 instanceof 父类也返回 true,这就是继承场景下 instanceof 用法的特点。
【免责申明】
本文基于标准 JavaScript 规范讲解 instanceof 用法,不同 ES 版本 浏览器引擎行为基本一致,部分特殊 polyfill 环境会有差异,本文仅作为前端学习备考参考。


