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);
作用一共就两点:
- 可以判断该数据是复杂数据类型还是基本数据类型,通过右侧值为Object来进行判断
- 判断某个复杂数据类型是否是开发所输入的那种对象.
手写思路
- 创建一个函数
- 这个函数有两个参数,第一个为想要判断的那个实例,另一个为被判断的对象
- 因为它对于所有简单数据类型都返回
false,但是string/boolean/number都有包装对象类型,可以被认为它们也有原型,但它们本身仍然不被instanceof所认可,那么需要用typeof对左侧实例对象是否为上述三个类型进行判断,如果是,直接返回false - 如果不是它们,则创建两个变量,分别用
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;}}
相关文章:
JS手写instanceof(内含源码与详解)
前言 本文主要讲解JavaScript如何手写一个简易的instanceof,从而实现数据类型判断的作用.那么好,本文正式开始. instanceof作用 instanceOf的作用就是用来判断JavaScript中的数据类型是否是开发所输入的那种, 语法格式:obj instanceof objtype 左侧就是要判断的数据,而右侧就…...
无公网IP下,如何实现公网远程访问MongoDB文件数据库
文章目录 前言1. 安装数据库2. 内网穿透2.1 安装cpolar内网穿透2.2 创建隧道映射2.3 测试随机公网地址远程连接 3. 配置固定TCP端口地址3.1 保留一个固定的公网TCP端口地址3.2 配置固定公网TCP端口地址3.3 测试固定地址公网远程访问 前言 MongoDB是一个基于分布式文件存储的数…...
初始化的内容写到析构函数中。。。。。。。
大概是,把应该在构造函数中初始化的堆栈窗体代码写到了析构函数中。。。。 不是因为没掌握构造/析构,而是。。。。 检查了四十多分钟没检查出来。。 被自己蠢哭。 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) { }…...
git 使用过程错误集合
文章目录 1、git-credential-manager-core was renamed to git-credential-manager2、credential-manager-core is not a git command. See git --help. 1、git-credential-manager-core was renamed to git-credential-manager 出现以下提示建议尽快更新您的 Git 配置以使用新…...
Lua判断字符串包含另一个字符串
string.find(“原字符串”,“目标字符串”) 返回这个子串的起始索引和结束索引,否则就会返回nil local index sting.find("ABCD",AB) --结果 1 2 if(index ~ nil)return true endstring.match(“原字符串”,“目标字符串”) local result string.mat…...
二叉树之推排序(升序)
目录 1.思路1.1大堆的建立方法1.2排序的方法 2.代码实现以及测试代码 1.思路 如何将一个堆进行排序,并变成升序?首先,如果要完成升序,那我们可以建立一个大堆,因为大堆可以选出一个最大的值放在堆的最上面,…...
【Docker项目实战】使用Docker部署Plik临时文件上传系统
【Docker实战项目】使用Docker部署Plik 临时文件上传系统 一、Plik介绍1.1 Plik简介1.2 Plik特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker compose 版本 四、下载Plik镜像五、部署Plik临时…...
JsonRPC协议详解(协议介绍、请求示例、响应示例)
JsonRPC协议详解 文章目录 JsonRPC协议详解什么是RPC?什么是JsonRPC?JsonRPC详解请求示例响应示例成功和失败响应示例参数的数据类型 结束语 什么是RPC? RPC(远程过程调用)是一种用于实现分布式系统中不同进程或不同计…...
系列六、Spring整合单元测试
一、概述 Spring中获取bean最常见的方式是通过ClassPathXmlApplicationContext 或者 AnnotationConfigApplicationContext的getBean()方式获取bean,那么在Spring中如何像在SpringBoot中直接一个类上添加个SpringBootTest注解,即可在类中注入自己想要测试…...
如何把 Oracle 19C RAC+DG加入到ORACLE EM 13C监控
平时见ORACLE 19c rac single dg的部署很多了,ORACLE em 13c 的安装也很多了,但如何把手工部署的oracle 19c rac dg 添加到em 13c 中去,让EM13C 来实现对RACDG的监控,主要是DG的EM13C的监控,还没有看到,大部分都是直接…...
Go 编程语言详解:用途、特性、与 Python 和 C++ 的比较
什么是Go? Go是一个跨平台、开源的编程语言Go可用于创建高性能应用程序Go是一种快速、静态类型、编译型语言,感觉上像动态类型、解释型语言Go由Robert Griesemer、Rob Pike和Ken Thompson于2007年在Google开发Go的语法类似于C Go用于什么? Web开发&…...
后缀数组
后缀数组感觉有点不好解释,简单记录一下板子。 后缀数组性质 lcp(i, j):指的是第i个后缀以及第j个后缀的最大公共前缀的长度 lcp(i, j) lcp(j, i) lcp(i, i) len(i) lcp(i, j) min(lcp(i, k), lcp(k, j)) 在o(nlogn)的时间复杂度内处理一个字符串ÿ…...
矩阵的初等变换
1.矩阵的初等变换的分类: 1.按类型分:初等行变换(动行),初等列变换(动列) 2.按方式分: 1.交换矩阵的两行或者两列 2.用一个不为0的数乘矩阵的某一行 3.用一个任意的数乘矩阵的某一行…...
Redis面试题:分片集群相关问题
目录 面试官:redis的分片集群有什么作用 面试官:Redis分片集群中数据是怎么存储和读取的? 面试官:redis的分片集群有什么作用 候选人:分片集群主要解决的是,海量数据存储的问题,集群中有多个m…...
leetcode设计循环队列(链表方式来实现)
上次我们那个设计循环队列的时候用的是数组,因为那个时候还是不太会链表,现在有了链表的思路,我们一起来看看解题步骤吧。 https://leetcode.cn/problems/design-circular-queue/description/ 设计循环队列 那我们其实最主要的就是我们这个…...
什么是高级语言、机器语言、汇编语言?什么是编译和解释?
1、高级语言 计算机程序是一种让计算机执行特定任务的方法。程序是由程序员用一种称为编程语言的特殊语言编写的。编程语言有很多种,例如 C、C、Java、Python 等。这些语言被称为高级语言,因为它们更接近人类的自然语言,而不是计算机能够直接…...
简要介绍Spring原生框架与Spring是轻量级框架的原因
😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…...
成为AI产品经理——AI产品经理工作全流程
目录 一、业务背景 二、产品工作流程 1.需求定义 2.技术预研 3.数据准备 4.模型构建、宣讲和验收 5.工程开发及产品上线运营 一、业务背景 背景:排球日常训练活动、排球中考项目和排球体测项目耗费了大量人力成本和时间成本。 目标:开发一套用…...
git commit 撤销的三种方法
一般在提交代码的时候,顺序是这样的 git status // 查看修改文件状态(已添加至暂存区还是未添加至暂存区)git add . // 添加所有已修改文件 git add xxx/xxx // 添加目录为xxx/xxx的文件至暂存区git commit -m xx功能全部完成 // 提交暂存区…...
Linux系统编程 day06 进程间通信
进程间通信 1. 进程间通信的概念2. 匿名管道pipe3. 命名管道FIFO4. 内存映射区 1. 进程间通信的概念 在Linux的环境下,进程地址空间是相互独立的,每个进程有着各自不同的用户地址空间。一个进程不能访问另一个进程中的内容,要进行数据交换必…...
使用Docker快速部署Sentinel Dashboard:从构建到运行的全流程指南
1. 为什么选择Docker部署Sentinel Dashboard 第一次接触Sentinel Dashboard时,我尝试过直接在服务器上运行jar包。结果遇到各种环境问题:JDK版本不匹配、端口冲突、时区设置错误...折腾半天都没跑起来。后来改用Docker部署,整个过程变得异常简…...
【从零开始学Java | 第三十二篇】方法引用(Method Reference)
目录 前言 一、什么是方法引用? 1.引例 2.方法引用的语法 二、方法引用的分类 1.引用静态方法 2.引用成员方法 ①其他类:其他类对象::方法名 3.引用构造方法 4.使用类名引用成员方法 5.引用数组的构造方法 总结 前言 在 Java 8 引入 Lambda 表…...
大模型概述1
一个中文字符大约0.6个token,一个英文单词一般0.3个token,不同的大模型有自己不同的tokenize。令牌化的方法。FLOPs:算力的参数,多少此浮点型运算大模型分类:分类方式一:多模态的,多种形态的模型…...
告别盲调!用VCS+DVE命令行(UCLI)高效调试SystemVerilog测试平台
高效调试SystemVerilog测试平台的命令行艺术:VCSUCLI实战指南 在数字芯片验证领域,调试环节往往占据工程师70%以上的工作时间。当面对包含数十万行代码的复杂测试平台时,传统的图形界面调试方式就像用放大镜观察星空——虽然清晰但效率低下。…...
Electron 27 静默打印实战:从样式错乱到完美适配的完整避坑指南
Electron 27 静默打印实战:从样式错乱到完美适配的完整避坑指南 在桌面应用开发领域,Electron 凭借其跨平台特性和强大的 Web 技术集成能力,已成为构建商业级应用的首选框架。然而,随着 Electron 27 的发布,许多开发者…...
Microsoft on GitHub项目结构深度解析:理解微软开源战略布局
Microsoft on GitHub项目结构深度解析:理解微软开源战略布局 【免费下载链接】microsoft.github.io Microsoft on GitHub 项目地址: https://gitcode.com/gh_mirrors/mi/microsoft.github.io Microsoft on GitHub项目作为微软开源战略的重要窗口,…...
500+ RPG Maker插件终极指南:如何快速提升你的游戏开发效率
500 RPG Maker插件终极指南:如何快速提升你的游戏开发效率 【免费下载链接】RPGMakerMV RPGツクールMV、MZで動作するプラグインです。 项目地址: https://gitcode.com/gh_mirrors/rp/RPGMakerMV 你是否正在为RPG Maker MV和MZ寻找高质量的插件资源ÿ…...
51单片机GPIO控制实战:手把手教你玩转P0-P3端口
51单片机GPIO深度实战:从端口特性到高级控制技巧 当你第一次点亮LED时,那种成就感就像打开了嵌入式世界的大门。但真正掌握51单片机的GPIO,远不止让灯闪烁那么简单。P0-P3这四个看似简单的端口,藏着许多工程师多年积累的实战经验。…...
GHelper终极指南:5步解锁华硕笔记本隐藏性能,告别Armoury Crate臃肿
GHelper终极指南:5步解锁华硕笔记本隐藏性能,告别Armoury Crate臃肿 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyr…...
OBS智能背景移除插件:3步实现专业级无绿幕抠图效果
OBS智能背景移除插件:3步实现专业级无绿幕抠图效果 【免费下载链接】obs-backgroundremoval An OBS plugin for removing background in portrait images (video), making it easy to replace the background when recording or streaming. 项目地址: https://git…...
