手把手带你写一个JavaScript类型判断小工具

业务写了很多,依然不是前端大神,我相信这是很多‘入坑’前端开发同学的迷茫之处,个人觉得前端职业发展是有路径可寻的,前期写业务是一个积累过程,后期提炼总结,比如编程思想,父子类的原型继承,还是对象之间的关联委托,设计模式的熟悉和运用,这都是一个前端工程师成长为高级工程师的必经之路,而这条道路是需要我们耐住性子,请相信,生活早晚会回报我们的努力。

      话不多说,进入我们今天的主题,JavaScript中判断一个数据的类型有多种方式:typeof、instanceof、constructor、Object.prototype.toString.call,一般判断简单的数据类型我们会使用typeof,但是对于数组,正则类型的数据,typeof是无能为力的,instanceof一般用于判断对象的继承关系,今天我们主要说的是Object.prototype.toString.call这个方法。

      1.判断类型      

我们可以写一个isType的方法来判断数据的类型,传入两个参数,第一个是需要判断的数据,第二个是数据类型。

前置知识:各个类型通过Object.prototype.toString.call方法后得到的结果console.log(Object.prototype.toString.call('hello')) //[object String]
console.log(Object.prototype.toString.call(34)) //[object Number]
console.log(Object.prototype.toString.call(true))// [object Boolean]
console.log(Object.prototype.toString.call(undefined)) //[object Undefined]
console.log(Object.prototype.toString.call(function f() {})) // [object Function]下面我们就开始撸代码了:
function isType(content,type){//这里我们通过正则匹配去掉'[object ]',只留下类型let t = Object.prototype.toString.call(content).replace(/\[object\s|\]/g,'');//将得到的t与传入的type进行比较,返回结果,结果为Boolean类型return t === type;
}
//执行函数并将结果返回给res,打印res
let res = isType('hello','String')
console.log(res);//true

是不是非常简单,对自己又充满信心了,不过如此嘛!!确实很简单,来,继续,一点点深入~~

通过上面的一个函数我们就可以很容易的判断一个JavaScript数据的类型,但是我们在使用的时候是这个样子的:

let res1 = isType('hello','String');
let res2 = isType(123,'Number');
let res3 = isType(true,'Boolean');

我们每次在使用的时候都是手动传入类型,很有可能手一抖,就传错类型了,本来'String',我们传入了'Strings',是不是很坑爹呀~~

一般的库或者插件不会这样去让我们使用,一般会这么使用utils.isString('hello'),我们只需要传入我们的数据就可以了,插件会提供相应的判断方法,比如

utils.isString('hello');
utils.isNumber(123);
utils.isBoolean(true);

这里我们需要批量化生产函数,就需要用到下面的一个函数返回一个函数,也就是所谓的闭包,也被叫做高阶函数,不要那些高大上,我们程序员都是接地气的~~,初学者对于闭包理解起来比较困难,不着急,随着你的深入,都会明白的~~~

      2.一个函数返回一个函数

接下来我们对上面的isType函数进行改造,

let isNumber = isType('Number');
let isString = isType('String');
let isBoolean = isType('Boolean');
isNumber(12);
isString('hello');
isBoolean(true)

通过执行isType(),我们可以得到想要的函数,说明在isType内部,我么返回了一个函数,返回的这个函数对于外层函数 (也就是isType) 的参数进行了引用,JavaScript的垃圾回收机制是不会回收被引用的数据的,所以type被保留在了返回函数的内部,这就是闭包机制。

function isType(type) {return function(content) {let t = Object.prototype.toString.call(content).replace(/\[object\s|\]/g,'');return t === type;}
}

通过执行isType,我们得到了对内部函数的引用。

isNumber(12);
isString('hello');
isBoolean(true);

上面其实就是对isType内部函数的执行。

也不过如此嘛,说好的手把手带我们写一个判断类型插件呢!?

      3.属于我们自己的判断JavaScript类型插件

有些同学已经有启发了,我们可以这样操作

let type = ['String','Number','Function','Undefined','Boolean','Array'];
let utils = {};
type.forEach(item => {utils['is'   item] = isType(item);
})

下面是console.log(utils)的结果


是不是很惊喜~~

我们可以利用ES6的模块化机制来封装这个方法,然后erport 出去供小伙伴使用,是不是很简单,也可以上传到npm,供广大开发者使用,是不是很有成就感。(估计这个难度的插件去你npm下载使用的人几乎没有,这里我们掌握怎么通过闭包去处理问题这个思想就行)下面是完整版utils.js

function isType(type) {return function(content) {let t = Object.prototype.toString.call(content).replace(/\[object\s|\]/g,'');return t === type;}
}function createUtils(){let utils = {};let type = ['String','Number','Function','Undefined','Boolean','Array'];type.forEach(item => {utils['is'   item] = isType(item);})return utils;
}
let utils = createUtils();
export default{utils}

希望对你有所帮助,这条路还很长,慢慢来~~~

后续敬请期待算法与数据结构系列~~~~

如果你觉得对你又帮你,请点个赞,这是对原创者最大的写作分享动力~~~~


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

yolov3之pytorch源码解析_springmvc源码架构解析之view

说在前面前期回顾sharding-jdbc源码解析 更新完毕spring源码解析 更新完毕spring-mvc源码解析 更新完毕spring-tx源码解析 更新完毕spring-boot源码解析 更新完毕rocketmq源码解析 更新完毕dubbbo源码解析 更新完毕netty源码解析 更新完毕spring源码架构更新完毕springmvc源码架…

Xstream将XML转换为javabean的问题

1.问题:Xstream is not security 解决方法:加上 2.问题:如果没有第二行代码,会出现xstream forbiddenclassexception 解决方法:加上第二行,其中参数是要进行解析的对象! 调用该方法:…

蚂蚁属性细微差别

每隔一段时间,我会想起Ant属性的一些细微差别 ,一旦忘记它们,在与Ant交互时会引起混乱。 特别是, Ant属性 通常是不可变的 (不包括Ant 1.8版本的 局部属性 ),并且在其首次设置时“永久”设置&am…

《从零构建前后分离的web项目》准备 - 前端了解过关了吗?

前端基础架构和硬核介绍 技术栈的选择 首先我们构建前端架构需要对前端生态圈有一切了解,并且最好带有一定的技术前瞻性,好的技术架构可能日后会方便的扩展,减少重构的次数,即使重构也不需要大动干戈,我通常选型技术栈…

联想w540笔记本参数_2020年12月笔记本电脑推荐!联想、惠普、华为笔记本电脑推荐!18款高性价比笔记本电脑推荐!!!...

前言&#xff1a;笔记本电脑&#xff0c;主要分为三种&#xff1a;轻薄本<全能本<游戏本。轻薄本&#xff0c;又称办公笔记本电脑&#xff0c;因为轻薄方便携带&#xff0c;通常用于移动办公使用。全能本&#xff0c;就是把轻薄本的集显变成了小独显&#xff0c;增加了独…

【BZOJ 1098】办公楼(补图连通块个数,Bfs)

补图连通块个数这大概是一个套路吧&#xff0c;我之前没有见到过&#xff0c;想了好久都没有想出来QaQ 事实上这个做法本身就是一个朴素算法&#xff0c;但进行巧妙的实现&#xff0c;就可以分析出它的上界不会超过 $O(n m)$。 接下来介绍一下这个技巧&#xff1a; 很显然一个…

Spring MVC:资源

我从博客读者那里收到的最常见的问题之一是如何在Spring MVC的应用程序中使用CSS和javascript文件。 因此&#xff0c;这是撰写有关Spring MVC中资源使用情况的文章的好机会。 通常&#xff0c;我将使用基于Java的配置方法。 如今&#xff0c;很难想象没有CSS和JavaScript文件…

c语言读文件空格间隔,c语言文件流实现按单个词读取(以空格、分号等作间隔)...

c语言文件流实现按词读取(以空格、分号等作间隔)1.基本描述在之前的作业中&#xff0c;认真编写代码&#xff0c;从中发现不少知识积累上的欠缺。编程中使用到的c语言文件读取&#xff0c;要求是按照获取到一个完整的词&#xff0c;并对其进行处理。写有java或c语言源程序的.tx…

山东专升本access知识点_全国各省份每年的专升本考试大纲啥时候公布?考纲公布之前你该做什么?...

?星标/置顶专升本招考下一个上岸的就是你最近小编在专升本招考后台收到很多同学的留言&#xff0c;大多同学都是看到好多省都公布了专升本考试政策和大纲&#xff0c;却迟迟不见自己所在的省份出&#xff0c;于是火急火燎地找到小编来问&#xff1a;XX省的考试大纲到底啥时候出…

观点|蚂蚁金服玉伯:我们是如何从前端技术进化到体验科技的?

小蚂蚁说&#xff1a;王保平&#xff0c;花名玉伯。熟悉前端和SeaJS的人一定对这个名字不陌生。作为前端领域的一枚大大大牛&#xff0c;他现在担任蚂蚁金服体验技术部负责人。本文&#xff0c;他分享了他从前端一路进阶升级到体验科技的个人思考&#xff0c;并详细介绍了体验科…

excel 电阻并联计算_电路分析基础(5)-关于电阻,有些话我还是要说一说

电阻定义&#xff1a;导体对电流的阻碍作用就叫该导体的电阻。不同的导体&#xff0c;电阻一般不同&#xff0c;电阻是导体本身的一种性质。定义式如下&#xff1a;因此&#xff0c;我们应该清楚了欧姆定律的本质到底是什么&#xff0c;为啥电阻跟电压和电流没有关系&#xff0…

针对新手的Java EE7和Maven项目–第2部分–为我们的应用程序定义一场简单的战争...

从第一部分恢复 第1部分 我们刚刚定义了父 pom。 一种特殊的pom类型&#xff0c;它最终定义了我们的应用程序将要使用的库。 它还配置了所有用于打包我们应用程序每个模块的Maven工具。 您可以在此处 签出 -1部分示例代码。 因此&#xff0c;到目前为止&#xff0c;在将要开发…

postman实现从response headers中获取cookie,并将其设置为环境变量

1.最近在学习postman的使用方法,为了保证后续模块操作&#xff0c;必须在登录时获取的session值&#xff0c;并将其设置为环境变量&#xff0c;session的位置处于response headers里面返回的set-cookie参数&#xff0c;并且将set-cookie中的session通过split方法截取出来. 写法…

010 pandas的DataFrame

一&#xff1a;创建 1.通过二维数组进行创建 2.取值 取列,取位置的值 3.切片取值 这个和上面的有些不同&#xff0c;这里先取行&#xff0c;再取列 4.设定列索引 这里使用的行索引与上面不同。 5.通过字典的方式创建 6.索引 包含行索引&#xff0c;与列索引 7.修改列索引 转载于…

unity烘培单个物体_Unity可编程渲染管线(SRP)教程:二、自定义着色器

本文翻译自Catlike Coding&#xff0c;原作者&#xff1a;Jasper Flick。本文经原作者授权&#xff0c;转载请说明出处。原文链接在下&#xff1a;https://catlikecoding.com/unity/tutorials/scriptable-render-pipeline/custom-shaders/​catlikecoding.com本章内容如下&…

一套比较完整的前端技术选型,需要规整哪些东西,你知道不?

1. 背景及现状 随着前端开发复杂度的日益增加&#xff0c;各种优秀的组件框架也遍地开花。同时&#xff0c;我们面临业务规模的快速发展和工程师团队的不断扩张&#xff0c;如何解决资源整合、模块开发、项目部署、性能优化等问题势在必行。 2. 目标 根据背景和现状的分析&a…

asp.net core2.0里的Nlog

Microsoft.Extensions.Logging&#xff0c;到了Version2.0.0.0&#xff0c;没了AddNlog() ? ——我找不到输出的日志&#xff01; 。。。。。经过一番百度 step1:添加个Provider 这样&#xff0c;在Startup里Configure实现一个ILoger 如果在controller里使用&#xff1f;——…

golang jwt设置过期_听说你的JWT库用起来特别扭,推荐这款贼好用的!

以前一直使用的是jjwt这个JWT库&#xff0c;虽然小巧够用, 但对JWT的一些细节封装的不是很好。最近发现了一个更好用的JWT库nimbus-jose-jwt&#xff0c;简单易用&#xff0c;API非常易于理解&#xff0c;对称加密和非对称加密算法都支持&#xff0c;推荐给大家&#xff01;简介…

随机验证码 pillow

安装 pip3 install pillow 基本使用 import PILfrom PIL import Imagefrom PIL import ImageDraw, ImageFontimport random 1.创建图片 from PIL import Image img Img.new(mode"RGB",size(120.30),color(255,255,255))# 在图片查看器中打开 # img.show()# 保存在本地…

微信小程序裁剪图片成圆形

前言 最近在开发小程序&#xff0c;产品经理提了一个需求&#xff0c;要求微信小程序换头像&#xff0c;用户剪裁图片必须是圆形&#xff0c;也在github上看了一些例子&#xff0c;一般剪裁图片用的都是方形&#xff0c;所以自己打算写一个小组件&#xff0c;可以把图片剪裁成圆…