instanceof用于判断对象是否为某构造函数实例,通过检查对象原型链是否包含构造函数的prototype;适用于内置对象和自定义构造函数检测,但在跨iframe场景失效,且null/undefined不可作为左操作数。

instanceof 用于判断一个对象是否是某个构造函数的实例,即该对象的原型链上是否包含该构造函数的 prototype 对象。
基本用法和原理
语法为:object instanceof Constructor。JavaScript 引擎会沿着 object.__proto__ 一层层向上查找,直到找到与 Constructor.prototype 全等的对象,或到达原型链末端(null)为止。
- 如果中途匹配成功,返回
true - 如果查到尽头都没匹配,返回
false
常见使用场景
检测内置对象类型(比 typeof 更精确):
-
[] instanceof Array→true -
new Date() instanceof Date→true -
function(){} instanceof Function→true -
/(.)/ instanceof RegExp→true
注意:typeof [] 返回 "object",无法区分数组和其他对象,而 instanceof 可以。
自定义构造函数的检测
定义构造函数后,用 instanceof 判断实例归属:
function Person(name) { this.name = name; }
const p = new Person('Alice');
console.log(p instanceof Person); // true
console.log(p instanceof Object); // true(因为 Person.prototype.__proto__ === Object.prototype)
若修改了原型链(如重写 Person.prototype),需确保新原型的 constructor 正确指向 Person,否则不影响 instanceof 判断,但可能影响其他逻辑。
需要注意的边界情况
instanceof 在跨执行上下文(如 iframe)中会失效,因为不同 iframe 中的 Array 构造函数不是同一个引用:
- 在 iframe 内创建的数组
arr,arr instanceof Array在父页面中可能返回false - 此时推荐用
Array.isArray()或Object.prototype.toString.call(arr) === '[object Array]'
另外,null 和 undefined 不能作为左操作数,会直接报错;右操作数必须是函数,否则抛出 TypeError。











