章节索引 :

JavaScript instanceof

instanceof 运算符用于检测构造函数的 prototype 属性是否出现在某个实例对象的原型链上。(MDN)

instanceof 是另一种检测类型的手段,但通常用于检测对象之间的关系,如某个对象是不是由某个构造函数生成的。

function Person(name) {
  this.name = name;
}

var person = new Person('小明');

console.log(
  person instanceof Person,
); // 输出:true

1. 语法

对象 instanceof 构造函数;

虽然语法是这样的,其实左侧可以是任意数据类型,但右侧必须是一个函数。

否则会报如下错误:

[] instanceof {};

// Uncaught TypeError: Right-hand side of 'instanceof' is not callable

错误大致意思是 instanceof 的右操作数不能被调用。

JavaScript ,可被调用的目前只有函数。

2. 注意点

使用 instanceof 检测的时候,不一定只有一个为 true 的结果。

function Person(name) {
  this.name = name;
}

var person = new Person('小明');

console.log(
  person instanceof Person,
  person instanceof Object,
); // 输出:true

因为 instanceof 实际上是去左操作数的原型链上寻找有没有右操作数的原型

person 的原型链上既匹配到 Person.prototype 又能匹配到 Object.prototype,所以都能返回 true

使用的时候要注意这个问题,如判断某个对象的原型链上是否有 Object.prototype 的时候,要考虑到一些其他对象。

[] instanceof Object; // true

数组的原型链上也是有 Object.prototype 的,所以做一些检测的时候要考虑一些特殊情况。

3. 小结

instanceof 可以用来检测对象和构造函数之间的关系,其检测的原理是左操作数的原型上是否有右操作数的 prototype 属性,所以要注意一些检测的特殊情况。

前置知识
什么是JavaScript 开发与学习环境准备 调试方案
基础
JavaScript 变量 JavaScript 数据类型 JavaScript if 语句 JavaScript for 语句 JavaScript 算数运算符 JavaScript 比较运算符 JavaScript 逻辑运算符 JavaScript 表达式 JavaScript 函数 JavaScript 对象 JavaScript 字符串 JavaScript 数字 JavaScript 数组 JavaScript switch 语句 JavaScript while 语句 JavaScript break与continue JavaScript with document.cookie
内置对象
JavaScript Function JavaScript Math JavaScript Date JavaScript RegExp JavaScript JSON
JavaScript 与 DOM
什么是DOM DOM和JavaScript的关系 获取和操作 DOM 节点 JavaScript DOM与事件 JavaScript DOM 事件绑定 JavaScript DOM 事件对象 JavaScript DOM 事件流 JavaScript DOM 事件优化 JavaScript DOM 自定义事件
表单处理
使用 JavaScript 校验表单
BOM
BOM window 对象 常用的 BOM 相关对象 BOM 常用属性和方法
AJAX
JavaScript AJAX
进阶知识
JavaScript 异常处理 JavaScript 三元运算符 JavaScript 逗号操作符 JavaScript void JavaScript typeof JavaScript delete JavaScript debugger JavaScript getter &setter JavaScript 原型 JavaScript new操作符和构造函数 JavaScript instanceof JavaScript this JavaScript 严格模式 JavaScript 作用域 JavaScript 闭包 JavaScript 变量提升 JavaScript 对象包装器
常用库
jQuery Lodash moment.js swiper
进阶指南
ECMAScript6 Node.js Babel CSS 预处理器 代码规范 TypeScript Web Components 小程序 Vue / React / Angular JavaScript 关键字
常见疑点与误区
分号问题 对象属性访问问题 this 使用问题 浮点数精度问题 独一无二的 NaN 避免全局污染 控制台观察对象问题 根据环境选择语言特性
扩展
相关资源