当前位置: 首页 > news >正文

JS手写instanceof(内含源码与详解)

前言

本文主要讲解JavaScript如何手写一个简易的instanceof,从而实现数据类型判断的作用.那么好,本文正式开始.

instanceof作用

instanceOf的作用就是用来判断JavaScript中的数据类型是否是开发所输入的那种,
语法格式:obj instanceof objtype
左侧就是要判断的数据,而右侧就是开发输入的它的数据类型,instanceof就是判断它输入的这两个数据类型是否相同.它只能判断复杂类型,因为它是通过对象的原型和右侧的原型是否相等来判断,而基本数据类型没有原型所以只能返回false,它的返回值是true或者false.我们通过一段代码实例来更好的理解instanceOf的作用及其返回值.

let arr=[1,2,3]
let person='123'
console.log(arr instanceof Array);
console.log(person instanceof String);

作用一共就两点:

  1. 可以判断该数据是复杂数据类型还是基本数据类型,通过右侧值为Object来进行判断
  2. 判断某个复杂数据类型是否是开发所输入的那种对象.

手写思路

  1. 创建一个函数
  2. 这个函数有两个参数,第一个为想要判断的那个实例,另一个为被判断的对象
  3. 因为它对于所有简单数据类型都返回false,但是string/boolean/number都有包装对象类型,可以被认为它们也有原型,但它们本身仍然不被instanceof所认可,那么需要用typeof对左侧实例对象是否为上述三个类型进行判断,如果是,直接返回false
  4. 如果不是它们,则创建两个变量,分别用getPrototypeOf来获取它们的原型,因为它们的原型有一个原型链,所以需要用while循环,当不成功且没有追溯到实例的最上层原型时,则继续向上追溯.比如,一个person class中有一个person对象.

全部源码

function Handle(obj, type) {// 因为string、number、boolean可以new一个包装对象,作为基本数据类型,它们也有原型链,为了避免这种情况,typeof// 检查出是它们,则直接出局,如果不是则需要调用getPrototypeOf方法来进行原型链的获取,判断这个实参是否有原型if(typeof(obj)!='string'&&typeof(obj)!='boolean'&&typeof(obj)!='number'&&Object.getPrototypeOf(obj)){// 如果有则赋值给objLeftlet objLeft = Object.getPrototypeOf(obj);	// 调用type构造函数中的原型赋值给typeRightlet typeRight=Object.getPrototypeOf(type);// 条件循环,当满足下述两个条件之一跳出循环// 不满足,则不断调用objLeft上层的原型,直至是null或和类原型一致。因为原型的尽头是null。while(true){if (objLeft === null) return false;if (typeRight === objLeft) return true;// 不断向上追溯对象的原型链,直到为null或匹配objLeft=Object.getPrototypeOf(objLeft)}}else{return false;}}
http://www.lryc.cn/news/247057.html

相关文章:

  • 无公网IP下,如何实现公网远程访问MongoDB文件数据库
  • 初始化的内容写到析构函数中。。。。。。。
  • git 使用过程错误集合
  • Lua判断字符串包含另一个字符串
  • 二叉树之推排序(升序)
  • 【Docker项目实战】使用Docker部署Plik临时文件上传系统
  • JsonRPC协议详解(协议介绍、请求示例、响应示例)
  • 系列六、Spring整合单元测试
  • 如何把 Oracle 19C RAC+DG加入到ORACLE EM 13C监控
  • Go 编程语言详解:用途、特性、与 Python 和 C++ 的比较
  • 后缀数组
  • 矩阵的初等变换
  • Redis面试题:分片集群相关问题
  • leetcode设计循环队列(链表方式来实现)
  • 什么是高级语言、机器语言、汇编语言?什么是编译和解释?
  • 简要介绍Spring原生框架与Spring是轻量级框架的原因
  • 成为AI产品经理——AI产品经理工作全流程
  • git commit 撤销的三种方法
  • Linux系统编程 day06 进程间通信
  • 血的教训--redis被入侵之漏洞利用复现--总览
  • C语言矩阵乘积(ZZULIOJ1127:矩阵乘积)
  • 用windows自带的FTP服务器实现同一局域网建立ftp服务器实现文件共享的详细步骤
  • SpringBoot——模板引擎及原理
  • java开发中各个环境的适用场景
  • 【Java程序员面试专栏 专业技能篇】Java SE核心面试指引(二):面向对象思想
  • Redis 反序列化失败
  • uniapp 导航分类
  • Vue + Element UI 实现复制当前行数据功能及解决复制到新增页面组件值不更新的问题
  • 智慧化工~工厂设备检修和保全信息化智能化机制流程
  • 【LeetCode热题100】【哈希】字母异位词分组