话很少说,进入咱们今天的主题,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复制代码
是否是很是简单,对本身又充满信心了,不过如此嘛!!确实很简单,来,继续,一点点深刻~~npm
经过上面的一个函数咱们就能够很容易的判断一个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);复制代码
这里咱们须要批量化生产函数,就须要用到下面的一个函数返回一个函数,也就是所谓的闭包,也被叫作高阶函数,不要那些高大上,咱们程序员都是接地气的~~,初学者对于闭包理解起来比较困难,不着急,随着你的深刻,都会明白的~~~bash
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}复制代码
但愿对你有所帮助,这条路还很长,慢慢来~~~
后续敬请期待算法与数据结构系列~~~~
若是你以为对你又帮你,请点个赞,这是对原创者最大的写做分享动力~~~~