【JavaScript】【表达式和运算符】instanceof

前言

在JavaScript中,判断变量的类型,常常使用的是typeof运算符

typeof的痛点:

  • 所有的引用类型结果都是 Object;
  • 空值null的结果也是Object;

为此,引入 instanceof

一、instanceof

1.1 作用

  • 用于判断某个实例是否属于某构造函数
  • 在继承关系中,用来判断一个实例是否属于它的父类型或祖先类型的实例

1.2 使用

  • 语法 :object instanceof constructor

  • 参数:

    • object:某个实例对象
    • constructor:某个构造函数
  • 示例:

js 复制代码
// 类
class Maomi {} // 定义类
let fuLai = new Maomi() // fuLai是Maomi类的实例对象
fuLai instanceof Maomi // true

// 时间
new Date() instanceof Date // true

// 构造函数
function SetMaomi() {}
let fulai = new SetMaomi();
fulai instanceof SetMaomi // true

// 函数
function getMaomi() {}
getMaomi instanceof Function  // true

1.3 涉及的构造函数

  • 基础类型:String、Number、 Boolean、 Undefind、Null、Symbol
  • 引用类型:Object(Array、RegExp、Date、Function...)

1.3 实现原理

instanceof 的内部实现机制是:通过判断对象的原型链上是否能找到对象的 prototype,来确定 instanceof 返回值。

js 复制代码
function instance_of(L, R) {
    var O = R.prototype; 
    L = L.__proto__;
    while (true) {    
        if (L === null)      
             return false;   
        if (O === L) 
             return true;   
        L = L.__proto__;  
    }
}

代码释义 :

① L表示对象实例,R表示构造函数或者父类型实例

② 取R的显式原型,取L的隐式原型

③ 循环遍历,进行判断②中的两个值是否相等,相等返回true,不相等继续查找L的原型链

instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链上。

  • 示例:
js 复制代码
function SetMaomi() {}
let fulai = new SetMaomi();
fulai instanceof SetMaomi

观察fulai.__proto__和SetMaomi.prototype的结构:

注意点 :fulai instanceof SetMaomi 返回 true,则并不意味着该表达式会永远返回 true。 SetMaomi.prototype 属性的值有可能会改变,改变之后的值很有可能不存在于 fulai 的原型链上,这时原表达式的值就会成为 false

二、instanceof产生继承关系

typescript 复制代码
function Cat(name,age,type){
    this.name = name;
    this.age = age;
    this.type = type;
}
function YingDuan(name,age,type,sex){
    Cat.call(this,name,age,type);  
    this.sex = sex;
}
YingDuan.prototype = new Cat();  // 这里改变了原型指向,实现继承
var yd = new YingDuan("有鱼",2,"金渐层","男"); //创建了英短对象yd
console.log(yd instanceof YingDuan);    // true
console.log(yd instanceof Cat);    // true
console.log(yd instanceof Object);    // true

下面为了直观的观察,我就不采用循环的方式,直接一个一个的打印出来:

  • yd instanceof YingDuan:
  • yd instanceof Cat:
  • yd instanceof Object:

三、注意问题

  1. fulai instanceof SetMaomi 返回 true,则并不意味着该表达式会永远返回 true。 SetMaomi.prototype 属性的值有可能会改变,改变之后的值很有可能不存在于 fulai 的原型链上,这时原表达式的值就会成为 false
  2. instanceof 用于判断对象类型,但以下情况的结果都为false,请注意。
js 复制代码
console.log(Number instanceof Number)  // false
console.log(String instanceof String)  // false
console.log(null instanceof Object)   // false,null不具有任何对象的特性,也没有__proto__属性

参考

相关推荐
jktantan4 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
总要学点什么4 小时前
第89篇:三维特效-螺旋圆效果——让螺旋臂卷起一圈圈外扩的涟漪
开发语言·javascript·ecmascript·webgl·cesium·空间分析·1024程序员节
夕除4 小时前
Redis 过期策略
redis·笔记·面试
2601_962885725 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
excel5 小时前
encodeURI 和 encodeURIComponent 有什么区别?
前端
前端精髓5 小时前
调用openrouter的免费API模型
java·前端·javascript
赛博守夜人5 小时前
AI安全攻防与治理之十四:AI 安全测试不能脱离传统安全,Web、API、移动端与模型攻击面的组合拳
前端·人工智能·安全
开开心心_Every5 小时前
快速隐藏程序工具自定义快捷键一键切换
java·开发语言·前端·spring·智能手机·word·intellij-idea
networknomad6 小时前
OpenReplay:自己搭的会话回放工具,给前端排错用的
前端·其他
缓慢更新7 小时前
AI 辅助生成单测:从接口定义到用例的流水线
java·服务器·前端·网络·数据库·人工智能