稀土掘金 稀土掘金

typeof和instanceof的区别

前言

虽然typeof和instanceof是JavaScript中的基础知识,但这个知识点却有很多的小细节,所以导致有很多人被面试官问道这个问题时表现并不尽如人意。

数据类型

js中有7种数据类型,其中有6种基本数据类型:

  1. undefined
  2. Null
  3. Boolean
  4. Number
  5. String
  6. Symbol (在es10中加入了第7种原始类型BigInt,现已被最新Chrome支持) 其中Symbol是ES6新增的,还有一种复杂类型(引用类型)Object。 我们常用typeof和instanceof操作符来判断数据类型

typeof

typeof 是一个一元操作符不是函数,所以不需要传递参数,使用方法非常简单:typeof A,使用typeof会直接返回类型结果

// Numbers 
typeof 37 === 'number';
// Strings 
typeof "" === 'string';
// Booleans 
typeof true === 'boolean';
// Symbols 
typeof Symbol('foo') === 'symbol';
// Undefined 
typeof undefined === 'undefined'; 
typeof blabla === 'undefined'; // 一个未定义的变量,或者一个定义了却未赋初值的变量
// Objects 
typeof {a:1} === 'object';
type [1,2,3] = 'object'
------------------------'下面是不是有点奇怪?'--------------------------
// 函数
typeof function(){} === 'function';
// Null
typeof null === 'object'

我们可以轻松的用typeof判断数据类型,但是虚线下面的判断结构好像有点怪。这就涉及到了typeof实现原理的问题

typeof实现原理

让我们先来聊聊typeof的实现原理吧

js 在底层存储变量的时候,会在变量的机器码的低位1-3位存储其类型信息

  • 000:对象
  • 010:浮点数
  • 100:字符串
  • 110:布尔
  • 1:整数

但是undefinednull 这两个值却比较特殊

  1. null:所有机器码均为0
  2. undefined:用 −2^30 整数来表示

这里我们先不管undefined,现在你们知道为什么typeof判断null是对象了吗,因为null的机器码全是0,所以被当成了object。这个bug存在了将近20多年,也许永远也不会修复,因为这牵涉到太多的web系统,修复它会产生更多的bug,令许多系统无法正常工作。

typeof判断函数返回结果就是函数,这其实还好理解,函数也是对象,因为函数比较重要,有自己特殊的属性,所以我们用typeof判断函数时会区分与对象,单独显示。

但是万一我们要判断这个实例属于哪个对象,那显然这时typeof已经失去作用了,因为除了函数,它都会判断为对象,这时我们就需要用到instanceof

instanceof

instance中文翻译为实例,因此instanceof的含义就不言而喻,判断该对象是谁的实例,同时我们也就知道instanceof是对象运算符。

instanceof实现原理

instanceof的判断就是根据原型链进行搜寻,在对象obj1的原型链上如果存在另一个对象obj2的原型属性,那么表达式(obj1 instanceof obj2)返回值为true;否则返回false。下面代码说明了instanceof的使用方法

function Parent(){};
function Child(){};
function Other(){};

Child.prototype = new Parent();
let child = new Child();

child instanceof Child; // true
child instanceof Parent; // true
child instanceof Object; // true
child instanceof Other; // false

手写instanceof

手写instanceof代码的实现原理也是面试的考察点,instanceof核心实现如下,我们自己封装了一个具有instanceof功能的函数。

function instance_of(left, right) {
  let leftVal = left.__proto__;
  let rightVal = right.prototype;
  while (true) {
    if (leftVal === null) return false;
    if (leftVal === rightVal) return true;
    leftVal = leftVal.__proto__;
  }
}
let a = { name: '冯总' }
console.log(instance_of(a, Object));//true

总结

typeof与instanceof都是判断数据类型的方法,区别如下:

  1. typeof会返回一个变量的基本类型,instanceof返回的是一个布尔值

  2. instanceof 可以准确地判断复杂引用数据类型,但是不能正确判断基础数据类型

  3. 而typeof 也存在弊端,它虽然可以判断基础数据类型(null 除外),但是引用数据类型中,除了function 类型以外,其他的也无法判断

本文章已收录 JavaScript技术详解,更多JavaScript技术可查看专栏。 ❤码字不易点个免费的赞吧❤

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

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