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 相关文章推荐
javascript jQuery插件练习
Dec 24 Javascript
javascript浏览器兼容教程之事件处理
Jun 09 Javascript
javascript检查浏览器是否支持flash的实现代码
Aug 14 Javascript
使用JavaScript和CSS实现文本隔行换色的方法
Nov 04 Javascript
jQuery+ajax实现实用的点赞插件代码
Jul 06 Javascript
JQ选择器_选择同类元素的第N个子元素的实现方法
Sep 08 Javascript
基于Layer+jQuery的自定义弹框
May 26 Javascript
JSON与js对象序列化实例详解
Mar 16 Javascript
ztree实现权限横向显示功能
May 20 Javascript
js实现从左向右滑动式轮播图效果
Jul 07 Javascript
jQuery 实现鼠标画框并对框内数据选中的实例代码
Aug 29 jQuery
通过实例解析JavaScript for in及for of区别
Jun 15 Javascript
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
DedeCms模板安装/制作概述
2007/03/11 PHP
linux php mysql数据库备份实现代码
2009/03/10 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
javascript 点击整页变灰的效果(可做退出效果)。
2008/01/09 Javascript
PHP 与 js的通信(via ajax,json)
2010/11/16 Javascript
通过jquery还原含有rowspan、colspan的table的实现方法
2012/02/10 Javascript
JavaScript创建一个欢迎cookie弹出窗实现代码
2013/03/15 Javascript
杨氏矩阵查找的JS代码
2013/03/21 Javascript
jQuery getJSON()+.ashx 实现分页(改进版)
2013/03/28 Javascript
输入自动提示搜索提示功能的使用说明:sugggestion.txt
2013/09/02 Javascript
2014年50个程序员最适用的免费JQuery插件
2014/12/15 Javascript
JavaScript三元运算符的多种使用技巧
2015/04/16 Javascript
jQuery实现带滚动导航效果的全屏滚动相册实例
2015/06/19 Javascript
Bootstrap实现导航栏的2种方式
2016/11/28 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
2016/12/14 Javascript
ES6中Proxy与Reflect实现重载(overload)的方法
2017/03/30 Javascript
详解vue-cli中模拟数据的两种方法
2018/07/03 Javascript
Vue组件教程之Toast(Vue.extend 方式)详解
2019/01/27 Javascript
vue.js仿hover效果的实现方法示例
2019/01/28 Javascript
JavaScript深入V8引擎以及编写优化代码的5个技巧
2019/06/24 Javascript
如何在vue中使用HTML 5 拖放API
2021/01/14 Vue.js
js 执行上下文和作用域的相关总结
2021/02/08 Javascript
[01:00]选手抵达华西村 整装待发备战2016国际邀请赛中国区预选赛
2016/06/25 DOTA
[01:58]最残酷竞争 2016国际邀请赛中国区预选赛积分循环赛回顾
2016/06/28 DOTA
在Python中调用ggplot的三种方法
2015/04/08 Python
Python列表和元组的定义与使用操作示例
2017/07/26 Python
Python实现的随机森林算法与简单总结
2018/01/30 Python
使用sklearn进行对数据标准化、归一化以及将数据还原的方法
2018/07/11 Python
Python实现动态添加属性和方法操作示例
2018/07/25 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
canvas实现烟花的示例代码
2020/01/16 HTML / CSS
如何高效率的查找一个月以内的数据
2012/04/15 面试题
Lucene推荐的分页方式是什么?
2015/12/07 面试题
电力公司个人求职信范文
2014/02/04 职场文书
cf收人广告词
2014/03/14 职场文书
PyTorch的Debug指南
2021/05/07 Python