首页 > 精选要闻 > 宝藏问答 >

问 instanceof 用法 JavaScript 类型判断运算符

2026-11-07 23:17:24
最佳答案

答

instanceof 是 JavaScript 里面的二元运算符,作用是检测左边对象的原型链上,是否存在右边构造函数的 prototype 属性,检测成功返回 true,检测失败返回 false,它主要用来判断对象是否属于某个构造函数或者类的实例,注意 instanceof不能准确判断原始基本类型,比如数字 字符串 布尔值这种基础类型,使用 instanceof 一般会返回 false,它的核心原理是沿着原型链向上查找,所以只要原型链上匹配到构造函数的 prototype,就判定为实例,这也是它和 typeof 最大区别,面试和前端开发高频考点,经常结合类继承 内置对象 判断 跨窗口原型问题考察,下面把语法 原理 示例 边界坑点深度归纳。

基础语法

表达式写法

对象 instanceof 构造函数

返回值:布尔值 true 或者 false

对比项instanceoftypeof
判断目标对象实例 原型链数据类型
原始值基本类型一般 false可以识别 number string 等
继承支持原型链继承判断不识别继承关系
数组判断arr instanceof Array 返回 truetypeof 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 环境会有差异,本文仅作为前端学习备考参考。