问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

一文搞懂instanceof实现的原理是什么!

发布网友 发布时间:2024-09-28 23:38

我来回答

1个回答

热心网友 时间:2024-10-16 18:43

前言

类型的判断可以说在我们前端开发过程中无处不在,特别是在Typescript还未推出之前,我们在JS里面做类型判断显得就更加重要了。

判断数据类型的方式有特别多,比如大家常用的typeof、instanceof、Object.prototype.tostring.call()等等,那么每一种判断数据类的方法大家知道其中的原理吗?比如说instanceof的原理,今天我们就聊一聊instanceof是如何判断数据类型的。

1.基本概念

想要了解instanceof的原理,我们至少应该知道它的基本概念吧,我们可以先来看看官网是如何解释它的。

官网解释:

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

虽然官方的解释只有简短的一句话,但是对于许多人来说还是挺难理解的,不过我们可以抓出这句话中的几个关键点:

运算符

构造函数的prototype

对象原型链

很明显,instanceof与原型和原型链有关,所以强烈建议小伙伴们先去学一学原型和原型链的相关知识。

为了让小伙伴现有一个大概理解,我们用我们自己的话简单说一下instance。

通俗的解释:

instanceof是一个运算符,它可以用来判断某一个对象的类型,具体原理就是利用了原型和原型链。

基本用法:

AinstanceofB//trueorfalse

上段代码中的A就是我们需要判断类型的对象,B就是官方所说的构造函数,形如我们的Object、Function都可以称之为构造函数。

2.与typeof对比

我们判断类型的时候通常是将typeof和instanceof结合使用,虽然它们都可以判断数据类型,但是它们还是有很多不同点的,如下:

typeof:主要用来判断基础数据类型,比如:Number、String等等。

instanceof:主要用来判断对象数据类型,比如Function、Array等等。

typeof直接返回数据类型,而instanceof重在判断,它返回布尔值。

我们来看一段代码大家可能会更好理解一些。

代码如下:

<script>functionsay(){};//typeof判断数据类型console.log(typeof'小猪课堂');//stringconsole.log(typeof100);//numberconsole.log(typeoftrue);//booleanconsole.log(typeofundefined);//undefinedconsole.log(typeof{});//objectconsole.log(typeof[]);//objectconsole.log(typeofnull);//objectconsole.log(typeofsay);//function//instanceof判断数据类型leta=newString('123');letb=newsay();console.log('123'instanceofString);//falseconsole.log(ainstanceofString);//trueconsole.log([]instanceofArray);//trueconsole.log(binstanceofsay);//true</script>

从上段代码我们可以看出typeof只能判断基础数据类型(null除外),当判断其它数据类型时,它总是返回object或者function。

而instanceof可以用来判断对象数据类型,返回的是布尔值。

3.instanceof特点

上节中有一段代码我们可以拿出来再看一看:

letb=newsay();console.log(binstanceofsay);//true

上段代码中b是实例对象,say是构造函数,我们利用instanceof来进行判断时,返回的true,由此我们可以总结出instanceof如下特点:

instanceof左侧是一个实例对象,右侧是一个构造函数。

如果实例对象属于构造函数,那么instanceof就会返回true。

我们判断类型是使用的Array、Object、String等等其实就是一个构造函数。

总结:

由上可以得出,判断数据类型并不是instanceof最准确的说法,它主要是用来判断实例对象与构造函数之间的关系的。而判断数据类型只是我们利用它的特点变相实现罢了。

4.instanceof原理

到这里我们知道instanceof其实不仅仅是用来判断数据类型的,它实际上是用来判断一个实例对象与一个构造函数之间的关系的。

那么我们通常如何判断一个实例对象与一个构造函数之间的关系的呢?

答案就是利用原型和原型链!我们都知道每一个函数都有一个显式原型prototype,每一个对象都有一个隐式原型__proto__,当我们对象的原型链中存在构造函数的显式原型prototype时,我们就可以确定它们之间时存在关系的。

更简单的说法:

我们拿到instanceof左侧对象的原型链

再拿到instanceof右侧构造函数的显式原型prototype

如果原型链中存在显式原型prototype,instanceof返回true,否则返回false

如果大家对上面的说明看的模糊,那么快去补一补原型和原型链的知识。

我们可以简单实现一个instanceof函数,大家就更容易理解了。

代码如下:

/***@description判断对象是否属于某个构造函数*@pramsleft:实例对象right:构造函数*@returnboolean*/functionmyInstanceof(left,right){letrightPrototype=right.prototype;//获取构造函数的显式原型letleftProto=left.__proto__;//获取实例对象的隐式原型while(true){//说明到原型链顶端,还未找到,返回falseif(leftProto===null){returnfalse;}//隐式原型与显式原型相等if(leftProto===rightPrototype){returntrue;}//获取隐式原型的隐式原型,重新赋值给leftProtoleftProto=leftProto.__proto__}}

代码比较简单,主要就是需要循环实例对象的原型链。

我们回过头再看一遍代码:

letb=newsay();console.log(binstanceofsay);//true

上段代码为什么会返回true呢,其实是因为在new的操作过程中,有一步操作便是将say()构造函数的显式原型prototype赋值给了b的隐式原型__proto__,所以我们利用instance判断时,必然会满足leftProto===rightPrototype条件。

至于new操作符具体做了什么,大家可以去参考我的另一篇文章。

大家也可以直接打印看看结果:

console.log(b.__proto__===say.prototype);//true5.补充

instanceof判断数组时,如果把它归纳为Array是返回true,如果把它归纳为Object也是返回true的。

代码如下:

letarray=[1,2,3]console.log(arrayinstanceofArray);//trueconsole.log(arrayinstanceofObject);//true

究其原因其实是我们的数组也是一个对象,只不过这个对象稍微特殊一点罢了,大家也可以把数组的原型打印出来看看,一下就会明白了。

总结

看到这儿,你再回过头去看看官网关于instanceof的解释,相信你会恍然大悟!

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

如果觉得文章太繁琐或者没看懂,可以观看视频:?小猪课堂

原文:https://juejin.cn/post/7103335306103324685
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
织田n.on汉化合集百度云 织田信奈的野望百度云简体字幕高清速发速采纳 穿越火线手机版怎么申请土豪的号 各位 谁能给我刷级别啊 我玩穿越火线的 要求刷到最高级别的 穿越火线枪战王者牛逼号密码账号 穿越火线土豪号2015年求不玩cf的土豪送给我一个号 ...干姜,甘草,元胡,佛手,鸡内金,红参,白芍,桂枝,大枣,生 过生日早上从楼梯摔下来有什么征兆 为什么无线路由器绿灯一直闪? 今天早上下楼梯的时候,脚一下踩空,摔下去了,当时很痛... 坐月子需要有人照顾吗 月子里婆婆和妈的区别 (宫颈12点)慢性宫颈炎 腺体广泛鳞化 小灶轻度非典型性 建议治疗后检查... 海极星海极星治疗慢性宫颈炎 ...还是二档半离合(那样离合器片很容易烧),还是一档和油门? ...的方程式?是吸热还是放热? 液态水汽化是吸热反应吗? 多多发表见解... ...可以采用半离合慢慢前行吗?速很慢的。还是用1档好点?开车时不踩离合... 大家开车怎么跟车,是二档怠速啊,还是二档半离合(那样离合器片很容易烧... 缓慢跟车用几档? 新飞飞一把85级传说弓做出来要多少钱,砸成无机又需要多少钱 ...y85价格是1598,一个苹果7二手价格是1797,9成新的,那个比较好_百度知 ... ...能玩转大型游戏而不卡的 85成新左右 大概多少钱呢 产品包装成礼盒后利润大慨是多少? 4S刚出时候的移动版白色4S 16G内存 85成新的,能卖多少钱, 国行苹果5s只卖3800有买的吗,85成新, 哪个红木家具品牌比较有内涵? 提前做好哪几点,宝宝入园不哭闹少生病,9月份再准备就太晚了? 梦见从山崖落下 It's 什么 on Sunday--中间填cloud还是cloudly? It's a ___Sunday morning. 双方父母都希望来照顾月子,该怎么选择呢? 腰椎间盘突出腰疼怎么缓解 左侧腰疼什么原因 三星note3如何把本地图片导入到存储卡里 JS判断数据类型的三种方法 JS判断数据类型的5种方法 压榨香油怎样过滤,才能过滤的是清油。 xww命令的使用方法 !!!重金急求化学:硫酸铜晶体失去部分结晶水后是混合物还是纯净物啊¿... smartwindow找不到ip VM连接忘记IP的S7-200 SMART的步骤 豆浆机豌豆黄制作步骤 惠普打印机的ip怎么查看 2900买了二手GF2双头套机 现在想买个二手苹果手机、请问在网上买、那个上面买比较放心 急急急!请问黑莓9500这款手机到底怎么样?在淘宝上买二手的9500屏幕是不... 急急急!请问黑莓9500这款手机到底怎么样?在淘宝上买二手的9500屏幕是不... ...Pre Plus 在淘宝上卖1000-1600分几成新,有人买过吗。能说说你们的... ...Pre Plus 在淘宝上卖1000-1600分几成新,有人买过吗。能说说你们的... 雨季不再来专辑曲目