稀土掘金 稀土掘金

浅析instanceof 原理

概述

js中可以通过typeof操作符和instanceof操作符判断变量的类型。而typeof在判断基本类型的变量时能精准判断。当变量是数组、对象时都只会返回‘object',无法准确的说明该对象是什么类型的。但是instanceof基于原型链可以判断一个引用是否属于某构造函数。能弥补typeof 方法判断变量类型的缺点。本文旨在分析instanceof的底层原理,同时借此复习原型以及原型链的知识。

一、js中变量类型

本节先来回顾一下js的变量类型,js变量可以分为基本类型和引用类型。

(1)基本类型:字符串(string)、数值(number)、布尔值(boolean)、undefined、Null、Symbol

(2)引用类型:对象(Object)

基本类型和引用类型的区别

基本类型:

1、值类型的变量值存储在栈中,而引用类型的变量值 存储在栈中的 是指向堆中数组或对象的地址,这就是为何修改引用类型总会影响到其他指向这个地址的引用变量。)

2、保存与复制的是值本身

3、使用typeof检测数据的类型

引用类型:

1、保存在堆中

2、保存与复制的是指向对象的一个指针

3、使用instanceof检测数据类型

4、使用new()方法构造出的对象是引用型

在实际开发过程中,我们有时候需要判断变量的类型去做不同的逻辑处理。就会使用到typeof和instanceo操作符来判断变量类型。下面来看一下这个两个方法的区别。

二、typeof 和instanceof判断变量类型

(1)typeof 判断变量类型

typeof操作符是确定一个变量是字符串、数值、布尔值、还是undefined的最佳工具。如果一个变量是一个对象或者null,那么typeof就会返回“object”;虽然typeof在检测基本数据类型时是非常的得力的助手,但是在检测对象类型的时候用处就不大了,此时我们就需要instanceof操作符了,语法如下:

result = variable instanceof constructor

如果变量是给定的引用类型那么就会返回true,否则就会返回false

所有的引用类型的值都是Object的实例,因此在检测一个引用类型值和Object的构造函数时,instanceof都会返回true,如果使用instanceof操作符检测基本类型的值,则该操作符时钟会返回false,因此基本类型不是对象。那么instanceof的原理是什么?为什么能判断 变量是否来源于某个构造函数?涉及到原型以及原型链的知识。下一节研究什么是原型以及原型链。搞懂原型和原型链后instanceof的原理就明白了。

三、原型和原型链

1、原型

原型分为隐式原型(__proto__)和显式原型(prototype)。 由于所有的引用类型(数组、对象、函数)都具有对象特性。即可自由扩展属性(除了‘null')。因此浏览器为每一个可扩展的对象添加了一个__proto__属性。该属性称为隐式原型,是一个普通对象。

可以看到__proto__是一个对象,具有constructor、hansOwnProperty等属性。 函数也是引用类型,因此浏览器为其扩展了一个默认属性 prototype。叫作显式原型。也是一个普通的对象。

该对象包含了constructor和__proto__属性。隐式原型和显示原型的关系用一句话概述就是:对象的隐式原型指向构造该对象的构造函数的显式原型。

对象student是通过构造函数People实例化而来的。因此student的隐式原型(proto)与构造函数People的显示原型(prototype)完全相等。

2、原型链

当试图得到一个对象的某个属性时,如果这个对象本身没有这个属性,那么会去它的隐式原型__proto__(即它的构造函数的prototype)中寻找。如果它的构造函数的prototype中没有该属性,那么就会通过prototype.__proto__中去寻找。以此类推如果存在该属性会直到找到该属性为止。浏览器为了防止无限循环,找到最上层就是object了(祖先),再往上找就是null,说明此时不存在该属性。这个寻找的过程会形成一条链路,就是原型链。如下图所示:

其中Foo是构造函数,f是其实例化对象。曲线__proto__形成的就是原型链。 3、原型链的应用 简单模拟jquery封装dom方法的过程。

div1是构造函数Elem的实例化对象,调用html(div1.html())方法时,首先会在div1上寻找该方法。但是该对象上并没有该方法,因此会通过div1.__proto__即Elem.prototype去寻找该方法。正好Elem.prototype上有html方法,停止寻找并执行该方法。当调用toString()方法时候还是通过同样的方式去寻找,但是Elem.prototype上也不存在该方法,于是就通过Elem.prototype.__proto__向上寻找。所有对象的构造函数是Object。所以此时会去Object.prototype上寻找toString()方法。正好该对象上存在该方法,于是停止寻找并执行该方法。

四、instanceof 判断对象类型原理

上面分析了原型以及原型链的知识,现在我们看看instanceof底层是如何工作的。

instanceof底层实现的核心就是去判断对象的隐式原型是否等于构造函数的显式原型。如果相等就返回true。比如test是构造函数Test的实例化对象。因此会test.proto === Test.prototype因此会返回true,证明test是Test类型。而test.proto !== Object.prototype。因此会执行else逻辑递归判断。此时instance传入的参数为Test.prototype和Object。此时Test.prototype.proto === Object.prototype。因此返回true。证明test也是Object类型。 因此instanceof 是从原型的角度,来判断某引用属于哪个构造函数,从而判定它的数据类型。这样就弥补了typeof判断引用类型不准确的缺点。

五、总结

本文通过分析原型以及原型链,探索了instanceof的核心思想。原型以及原型链是js中很重要的知识点,也是自己一直以来不清晰的点。通过这次总结豁然开朗。文章中分析不到位之处望读者补充指正。

玻璃钢生产厂家上海特色商场美陈怎么样佛山玻璃钢花盆河北玻璃钢雕塑哪里找上海开业商场美陈销售企业佛山动物雕塑玻璃钢图片玻璃钢雕塑有人回收吗玻璃钢瓜果雕塑生产厂商电话多少户内玻璃钢雕塑哪家便宜南京商场美陈供应商池州步行街玻璃钢雕塑价位焦作园林景观玻璃钢景观雕塑昆明珠海玻璃钢雕塑镇江玻璃钢动漫卡通雕塑设计玻璃钢雕塑用什么牌子好福建玻璃钢花盆销售中山玻璃钢艺术雕塑江苏多彩玻璃钢雕塑价位玻璃钢人像雕塑制作黔南州商场美陈装饰广东周年庆典商场美陈价钱许昌玻璃钢雕塑费用石家庄抽象玻璃钢雕塑上海玻璃钢抽象雕塑价格河南大型主题商场美陈供货商常德玻璃钢雕塑价格小型商场气球美陈新款玻璃钢雕塑大钢琴宝鸡专业玻璃钢雕塑玻璃钢景观雕塑排行榜深圳仿铜玻璃钢雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化