JS中准确判断变量类型的方法


Posted in Javascript onJune 01, 2020

这是一个高频面试题,我们开发中也进程会遇到,今天我们来实现一个函数getValType(val)用来获取一个变量的类型。从1. JS基础变量类型。2. Js中判断变量的函数。 3. 实现getValType函数。3个方面来分析实现。

Js基础变量类型

JS 中,有 5 种基本数据类型和 1 种复杂数据类型,基本数据类型有:Undefined, Null, Boolean, NumberString;复杂数据类型是ObjectObject中还细分了很多具体的类型,比如:Array, Function, Date等等。

判断变量的函数

我们先定义一组变量来用下面的函数来测试:

var allVarMap = {
 // 数字
 num:123,
 // Infinity
 num1: 1 / 0,
 // NaN
 num2: null / 0,
 // 字符串
 str: 'abcdef',
 // 布尔类型
 bool: true,
 // 数组
 arr :[1, 2, 3, 4],
 // json对象
 json :{name:'wenzi', age:25},
 // 函数
 func:function(){ console.log('this is function'); },
 // 箭头函数
 func1: () => {console.log('arrow function')},
 // undefined类型
 und:undefined,
 // null类型
 nul:null,
 // date类型
 date:new Date(),
 // 正则表达式
 reg :/^[a-zA-Z]{5,20}$/,
 // 异常类型
 error:new Error()
}

typeof判断变量类型

typeof运算符用于判断对象的类型,但是对于一些创建的对象,它们都会返回object。我们用该函数来判断上面的结果:

var results = []
for (let i in allVarMap) {
	results.push(typeof allVarMap[i])
}
console.log(results.join())
// number,number,number,string,boolean,object,object,function,function,undefined,object,object,object,object

可以看到,NaNInfinity都检查为number类型,其他的 string,function,boolean,undefined包括箭头函数都能正确检查出来,但是对于reg,date,null都得到了object。看来还需要具体的判断。

instanceof检查

ECMAScript 引入了另一个 Java 运算符 instanceof 来解决这个问题。instanceof 运算符与typeof 运算符相似,用于识别正在处理的对象的类型。instanceof运算符用来判断一个构造函数的prototype属性所指向的对象是否存在另外一个要检测对象的原型链上。与 typeof 方法不同的是,instanceof方法要求开发者明确地确认对象为某特定类型。

console.log(allVarMap.date instanceof Date) // true
console.log(allVarMap.func instanceof Function) // true

可以看到instanceof可以正确判断出date,func的类型,但是前提是已知该变量的类型,所以这里不符合我们的预期。

使用Object.prototype.toString.call

定义:首先,取得对象的一个内部属性[[Class]],然后依据这个属性,返回一个类似于”[object Array]“的字符串作为结果(看过ECMA标准的应该都知道,[[]]用来表示语言内部用到的、外部不可直接访问的属性,称为“内部属性”)。利用这个方法,再配合call,我们可以取得任何对象的内部属性[[Class]],然后把类型检测转化为字符串比较,以达到我们的目的。
我们看看下面的函数运行结果:

var results = []
for (let i in allVarMap) {
	results.push(Object.prototype.toString.call(allVarMap[i]))
}
console.log(results.join())
// [object Number],[object Number],[object Number],[object String],[object Boolean],[object Array],[object Object],[object Function],[object Function],[object Undefined],[object Null],[object Date],[object RegExp],[object Error]

实现getValType函数

根据上面的分析,我们可以先用typeOf函数判断出基础类型number,string,function,boolean,undefined。然后如果结果是object,我们再用Object.prototype.toString.call来判断出具体的类型。

var getVarType = function (val = 0) {
	var type = typeof val
	// object需要使用Object.prototype.toString.call判断
	if (type === 'object') {
		var typeStr = Object.prototype.toString.call(val)
		// 解析[object String]
		typeStr = typeStr.split(' ')[1]
		type = typeStr.substring(0, typeStr.length - 1)
	}
	return type
}
var results = []
for (let i in allVarMap) {
	results.push(getVarType(allVarMap[i]))
}
console.log(results.join())
// number,number,number,string,boolean,Array,Object,function,function,number,Null,Date,RegExp,Error

可以看到,完美判断出了所有变量的类型,该函数可以再添加一些逻辑,判断一个变量是否是NaN,Infinity之类的特殊需求。

总结

1 typeOf能判断出一个变量的类型,但是只能判断出number,string,function,boolean,undefined,null和其他对象类型返回结果都为object.

2 instanceof能判断出一个对象是否是另一个类的实例。

3 Object.prototype.toString.call能判断出所有变量的类型,返回值为[Object ***]

以上就是一文看懂在JS中准备判断变量类型的详细内容,更多关于JS判断变量类型的资料请关注三水点靠木其它相关文章!

Javascript 相关文章推荐
js函数般调用正则
Apr 08 Javascript
下拉菜单点击实现连接跳转功能的js代码
May 19 Javascript
jquery等宽输出文字插件使用介绍
Sep 18 Javascript
使用jquery.qrcode生成彩色二维码实例
Aug 08 Javascript
JavaScript判断FileUpload控件上传文件类型
Sep 28 Javascript
jQuery移动端图片上传组件
Jun 12 Javascript
AngularJs Javascript MVC 框架
Jun 20 Javascript
Jquery和CSS实现选择框重置按钮功能
Nov 08 jQuery
JS闭包原理与应用经典示例
Dec 20 Javascript
vuejs数据超出单行显示更多,点击展开剩余数据实例
May 05 Javascript
JS页面获取 session 值,作用域和闭包学习笔记
Oct 16 Javascript
Vue中inheritAttrs的使用实例详解
Dec 31 Vue.js
Vuex中的Mutations的具体使用方法
Jun 01 #Javascript
vue使用自定义事件的表单输入组件用法详解【日期组件与货币组件】
Jun 01 #Javascript
Bootstrap table 服务器端分页功能实现方法示例
Jun 01 #Javascript
easyUI 实现的后台分页与前台显示功能示例
Jun 01 #Javascript
JS如何寻找数组中心索引过程解析
Jun 01 #Javascript
easyUI使用分页过滤器对数据进行分页操作实例分析
Jun 01 #Javascript
bootstrap-table后端分页功能完整实例
Jun 01 #Javascript
You might like
SMARTY学习手记
2007/01/04 PHP
PHP Session_Regenerate_ID函数双释放内存破坏漏洞
2011/01/27 PHP
基于PHPExcel的常用方法总结
2013/06/13 PHP
探讨:parse url解析URL,返回其组成部分
2013/06/14 PHP
php函数指定默认值方法的小例子
2013/12/04 PHP
php中静态类与静态变量用法的区别分析
2015/01/15 PHP
php使用FFmpeg接口获取视频的播放时长、码率、缩略图以及创建时间
2016/11/07 PHP
Laravel+Intervention实现上传图片功能示例
2019/07/09 PHP
基于JavaScript 数据类型之Boolean类型分析介绍
2013/04/19 Javascript
jQuery中多个元素的Hover事件解决方案
2014/06/12 Javascript
js实现正方形颜色从下往上升的效果
2014/08/04 Javascript
Redis基本知识、安装、部署、配置笔记
2015/03/05 Javascript
javascript实现很浪漫的气泡冒出特效
2020/09/05 Javascript
JS代码防止SQL注入的方法(超简单)
2016/04/12 Javascript
Angularjs中的页面访问权限怎么设置
2016/11/11 Javascript
Angular.JS中指令ng-if、ng-show/ng-hide和ng-switch的使用教程
2017/05/07 Javascript
JS回调函数基本定义与用法实例分析
2017/05/24 Javascript
详解bootstrap导航栏.nav与.navbar区别
2017/11/23 Javascript
JS与jQuery判断文本框还剩多少字符可以输入的方法
2018/09/01 jQuery
js常用正则表达式集锦
2019/05/17 Javascript
vue中添加与删除关键字搜索功能
2019/10/12 Javascript
Javascript如何递归遍历本地文件夹
2020/08/06 Javascript
[01:42:49]DOTA2-DPC中国联赛 正赛 iG vs PSG.LGD BO3 第一场 2月26日
2021/03/11 DOTA
Python基于smtplib实现异步发送邮件服务
2015/05/28 Python
python简单实现计算过期时间的方法
2015/06/09 Python
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
Python 两个列表的差集、并集和交集实现代码
2016/09/21 Python
Python简单基础小程序的实例代码
2019/04/28 Python
python实现用户名密码校验
2020/03/18 Python
python爬虫智能翻页批量下载文件的实例详解
2021/02/02 Python
英国美术用品购物网站:Cass Art
2019/10/08 全球购物
周年庆典邀请函范文
2014/01/23 职场文书
八一建军节活动方案
2014/02/10 职场文书
个人委托书范文
2015/01/28 职场文书
MySQL分区表实现按月份归类
2021/11/01 MySQL
Python中super().__init__()测试以及理解
2021/12/06 Python