您当前的位置:首页 > 互联网教程

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

发布时间:2025-05-19 17:56:29    发布人:远客网络

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

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

前言

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

二、如何判断js中的数据类型

1、如何判断js中的数据类型:typeof、instanceof、 constructor、 prototype方法比较

2、如何判断js中的类型呢,先举几个例子:

3、其中typeof返回的类型都是字符串形式,需注意,例如:

4、可以判断function的类型;在判断除Object类型的对象时比较方便。

5、判断已知对象类型的方法: instanceof

6、后面一定要是对象类型,并且大小写不能错,该方法适合一些条件选择或分支。

7、注意: constructor在类继承时会出错

8、A.prototype= new B();//A继承自B

9、alert(aobj.constructor=== B)----------->

10、alert(aobj.constructor=== A)----------->

11、而instanceof方法不会出现该问题,对象直接继承和间接继承的都会报true:

12、alert(aobj instanceof B)---------------->

13、alert(aobj instanceof B)---------------->

14、言归正传,解决construtor的问题通常是让对象的constructor手动指向自己:

15、//将自己的类赋值给对象的constructor属性

16、alert(aobj.constructor=== A)----------->

17、alert(aobj.constructor=== B)----------->

18、通用但很繁琐的方法: prototype

19、alert(Object.prototype.toString.call(a)===‘[object String]’)

20、alert(Object.prototype.toString.call(b)===‘[object Number]’)

21、alert(Object.prototype.toString.call(c)===‘[object Array]’)

22、alert(Object.prototype.toString.call(d)===‘[object Date]’)

23、alert(Object.prototype.toString.call(e)===‘[object Function]’)

24、alert(Object.prototype.toString.call(f)===‘[object Function]’)

25、大小写不能写错,比较麻烦,但胜在通用。

26、判断就可以了,遇到预知Object类型的情况可以选用instanceof或constructor方法,简单总结下,挖个坑,欢迎补充!

三、怎么看出js是nodejs还是javascript

怎么看出js是nodejs还是javascript

JavaScript中检测对象类型的运算符有:typeof、instanceof,还有对象的constructor属性: 1) typeof运算符 typeof是一元运算符,返回结果是一个说明运算数类型的字符串。如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在)。但 typeof的能力有限,其对于Date、RegExp类型返回的都是"object"。如:

JavaScript中检测对象类型的运算符有:typeof、instanceof,还有对象的constructor属性: 1) typeof运算符 typeof是一元运算符,返回结果是一个说明运算数类型的字符串。如:"number","string","boolean","object","function","undefined"(可用于判断变量是否存在)。但 typeof的能力有限,其对于Date、RegExp类型返回的都是"object"。如:

所以它只在区别对象和原始类型的时候才有用。要区一种对象类型和另一种对象类型,必须使用其他的方法。如:instanceof运算符或对象的 constructor属。 2)instanceof运算符。 instanceof运算符要求其左边的运算数是一个对象,右边的运算数是对象类的名字或构造函数。如果 object是 class或构造函数的实例,则 instanceof运算符返回 true。如果 object不是指定类或函数的实例,或者 object为 null,则返回 false。

promise是ES2015新增的内容,ES2015是javascript的一个标准,nodejs只是使用javascript做为开发语言。

所以说promise是归javascript的,与nodejs没有直接联系。

硬盘接口是硬盘与主机系统间的连接部件,作用是在硬盘缓存和主机内存之间传输数据。不同的硬盘接口决定着硬盘与计算机之间的连接速度,在整个系统中,硬盘接口的优劣直接影响着程序运行快慢和系统性能好坏。从家用用户的角度出发,硬盘接口分为IDE、SATA两种规格,不过他们各自具有自身的优势和特点,用户需要根据自身的情况来加以选择。 IDE接口硬盘及主板接口

IDE接口硬盘一般就是我们俗称的并行规格的PATA硬盘,目前大多数台式存储系统采用的都是称为Ultra-ATA的并行总线接口硬盘产品,这样的规格技术是自80年代以来一直被应用在桌上型系统作为主流的内部储存互连技术,由于运用领域十分广泛时间又较长,所以成熟的技术带来的是大规模集成制造的低成本和飞速发展的大容量。

由于长时间的没有改变,在数据的传输上来看,这种IDE接口硬盘显得有一些滞后,因为目前主流的PATA硬盘仅能支持ATA/100和ATA/133两种数据传输规范,传输速率最高只能达到每秒100或133MB,这仅可以满足目前一般情况下的大容量硬盘数据传输。另外,这类硬盘所使用的80-pin数据线在机箱内部杂而乱,它会阻碍空气在机箱里的流动,从而影响到系统的散热。虽然劣势明显,不过对于一些原来老用户来说,由于原有的主板平台并不支持SATA接口,这种IDE接口的PATA大容量硬盘还是首选,还有一些用户认为这类型的硬盘在技术上成熟、稳定,所以也选择这类型的PATA硬盘。

由英特尔、戴尔、希捷、Maxtor以及APT等厂商所组成serialata.,推出了就硬盘而言的新技术规格,Serial ATA,它为串行接口,在IDF Fall 2001大会上,希捷宣布了Serial ATA 1.0标准,正式宣告了SATA规范的确立这也是硬件新近颁布的一种的标准。

在技术特点来看,不得不承认PATA硬盘在安装、传输速率及功耗、抗震、噪声等多方面都要逊于SATA硬盘。因为SATA硬盘它具有更快的外部接口传输速度,数据校验措施更为完善,SATA 1.0规范规定的标准传输率可以达到150MB/S,这样可以充分发挥Serial ATA接口的性能优势,因为ATA100的理论数值是100MB/s,即便是ATA133也最高为133MB/s。另外在安装上首先SATA的连接线非常方便,而且SATA最重要的特性就是支持热插拔。串行SATA方式通过更好的数据校验方式,信号电压低可以有效的减小各种干扰,从而大大提高数据传输的效率,而且新式的SATA硬盘连接线也更加有利机箱内部的散热。

SATA并非只有优点,在缺点上也是显而易见,由于SATA规格还不十分成熟,这种类型的硬盘对外频要求要比并行规格硬盘高,如果用户有超频的情况这时一定要注意,因为它就会常常出现找不到硬盘或数据损坏的情况。目前支持SATA 2.0的硬盘也已经推出,相信不久SATA 3.0也会出现在市场中,但并非标准越高就越好,就目前而言这种SATA2.0规范的硬盘主要还是针对服务器和网络存储应用,如普通消费者选择SATA 1.0规范的硬盘产品足以

建议:你好;这种情况如果在***口可以看到包块就是外痔。如果没有并且痔疮在齿状线以上的才是内痔。应该去肛肠科做肛诊才能确定的。先不要自己服用药物。

雌雄金鱼主要从以下几个方面辨别:

(1)体形的差别:雄性金鱼一般体形略长,雌性金鱼身体较短且圆。怀卵期雌鱼较雄鱼腹部膨大。

(2)尾柄的差别:雄鱼比雌鱼略粗壮。

(3)胸鳍的差别:细心观察可发现,雄鱼稍尖长,胸鳍第一根鳍刺较粗硬;雌鱼呈短圆形,胸鳍第一根鳍刺不太硬。

(4)泄殖孔的差别:由肚皮向上看,雄鱼泄殖孔小而狭长,呈凹形;雌鱼泄殖孔大而略圆,向外凸。

(二)色泽的区别:雌雄不同的金鱼,在体色上略有差异,雄鱼一般颜色鲜艳,而雌鱼略淡一些,在繁殖发育期,雄鱼体色更为鲜艳。

(三)手感与动感:用手轻托鱼的腹部,中指和无名指感触到雄鱼腹部有一条明显的硬线,雌鱼则腹部较软。走过鱼池边时,猛踏脚观察,雄鱼游动速度快而且敏捷,雌鱼动作则慢一些。

(四)追星:随着气温的升高,金鱼在产卵期会出现第二特征--追星,这是辨别金鱼性别最容易、最准确的时候,也是最容易掌握的一种辨别方法。雄鱼的追星出现在胸鳍第一根刺和鳃盖边缘,多时整个胸鳍每个鳍条上都长有追星,前端的明显,后面的要仔细才可以观察到。这种粗糙的小白点就是追星。

运用以上辨别方法,还必须依靠有多年饲养的经验和平时细心观察,才能准确的辨别金鱼的雌雄。

应该看头上的红冠吧,大的是公的,小的是母的

你点升级进入他官网就可以看到,如果是盗版右下脚有提示

您可以直接在手机设置——通用——关于本机选项下查看手机型号。

如果手机型号后两位以CH结尾,说明是行货。

s版是sprit版有锁,v版是version一般没锁,都有标明吧

最简单的就是看线的类型,如果只有2个接口而且很细的话就是SATA接口,如果是3个接口而且是很宽的话就是IDE的

现在的主板都IDE和SATA两种接口都会有,不用担心这个,外置的一般是UsB的,更不用担心接口问题