前端基础数据类型 - 判断 & 应用

75 阅读3分钟

本文已参与「 新人创作礼 」活动,一起开启掘金创作之路

关于如何进行图片优化 - 适合的才是最好的

今天最后一天上班,明天就是五一假期,我在想今天该写点啥。昨天的工作一直在自己写一个React 搜索框相关的代码!

今天对于业务有点摸鱼状态,等我写完文章继续工作几个小时,填补白天的摸鱼状态!

我个人还是不太喜欢用图片。今天就都是代码 & 纯文字表达把、

第一个问题你认为前端的技术数据类型有哪些。

第二个问题你认为复杂的数据类型又有几个。

对于第一个问题估计大部分人都记得是八股文的五个:Number、String、Null、Undefined、Boolean。

但是在Es6同时又引入2个新的基础数据类型,BigInt、Symbol 

这里可以做一个归结,简单的数据类型typeof xxx ,就可以全部满足。

但是对于复杂的数据的类型,或许他就束手无策了。

例如  : typeof []   返回的就是 'object'

或许你会讲到intanceof  , 其他他是用来检测原型构造对象 ,主要的作用就是判断一个实例是否属于某种类型。

例如:[] instanceof Array  ,   new Date() instanceof Date , 放回就是true

例如:"1" intanceof Array. 放回的就是false

所以很多认为intanceof 无法判断 string类型其实这也是不对的。

后续我们改变下 , 对字符串的构造改变一下 ,let a = new String("1") a intanceof  String 这样得到的结构就是 true。

这个当然还是你要对前端的若数据类型更深层次的理解。

所以很多人看似简单,其实前端并不简单。

但是是因为兼容的容错性特别强大。( 他具有很多内形,内部就可以转换 )

这个时候有人也会使用constructor。但是不是所有的数据类型都有constructor。部分基础数据类型不具备。

例如 null、undefined。就是不行,我就不展开了。

下面这段代码绝对的牛逼中的战斗机。

Object.prototype.toString.call(obj).replace(/^\[object (\S+)\]$/, '$1');

通过方法call 把对象指向了Object原型的toString。防止了基础数据类型的系统性错误。因为一切对象都是通过来源Object的继承。

这样通过序列toString 得到的是'[object XXX类型]'

replace 是一个简单正则占位提取的方式,不是今天主要讲的。

let a1 = Object.prototype.toString.call(1).replace(/^\[object (\S+)\]$/, '$1');let a2 = Object.prototype.toString.call(null).replace(/^\[object (\S+)\]$/, '$1');let a3 = Object.prototype.toString.call(undefined).replace(/^\[object (\S+)\]$/, '$1');let a4 = Object.prototype.toString.call("1").replace(/^\[object (\S+)\]$/, '$1');let a5  = Object.prototype.toString.call(true).replace(/^\[object (\S+)\]$/, '$1');let a6  = Object.prototype.toString.call(Symbol(1)).replace(/^\[object (\S+)\]$/, '$1');let a7  = Object.prototype.toString.call(2n).replace(/^\[object (\S+)\]$/, '$1');console.log (a1 , a2 , a3 , a4 , a5 , a6 , a7)

结果为

Number Null Undefined String Boolean Symbol BigInt

如果这样判断起来是不是觉得更为方便。我们在阿里看看复杂的数据类型

let a8  = Object.prototype.toString.call(new Date()).replace(/^\[object (\S+)\]$/, '$1');

let a9  = Object.prototype.toString.call([]).replace(/^\[object (\S+)\]$/, '$1');

let a10  = Object.prototype.toString.call((function (){})).replace(/^\[object (\S+)\]$/, '$1');

let a11  = Object.prototype.toString.call((function *(){})).replace(/^\[object (\S+)\]$/, '$1');


let a12  = Object.prototype.toString.call(/S+/g).replace(/^\[object (\S+)\]$/, '$1');

let a13  = Object.prototype.toString.call(new Error()).replace(/^\[object (\S+)\]$/, '$1');

let a14  = Object.prototype.toString.call(Math).replace(/^\[object (\S+)\]$/, '$1');

console.log (a8)
console.log (a9)
console.log (a10)
console.log (a11)
console.log (a12)
console.log (a13)
console.log (a14)

得到的结果为:

Date、Array、Function、GeneratorFunction、RegExp、Error、Math

是不是感受起来更加的牛逼。其实讲解的内容不多,但是设计的知识点还是比较多,我也不属于什么老师讲课,没有系统,想到哪里说到哪里。

最后给大家出一个比较有趣的笔试题:

如果实现一个 console.log(a == 1 && a == 2 && a ==3); 为true

有兴趣的可以思考下,如果找到答案,想下他的实现逻辑!

先到这里,我今天还要开始工作,参与「 新人创作礼 」打卡还是蛮累的。想可以坚持下去,撸满30篇,后面我也好好休息下。