js 数据类型检测

发布时间:2021-03-31 作者:yaming042 阅读量:- 本文字数:4.2k 阅读时长 ≈ 4 分钟

在实际前端编码过程中,对变量类型的校验是必不可少的,比如你在接收到接口返回的列表数据后直接使用sort()进行排序,此时是否有问题?大部分时候是没有问题的,但是如果数据库中没有数据,接口可能返回的是null,你对null进行sort排序,会怎么样?可能页面直接空白崩溃,所以对数据类型进行校验还是很必要的。

下面介绍几种常用的方法:

typeof

使用 typeof 方法来检测数据类型,基本类型大部分都能被准确检测并返回正确的字符串(除了 Null 类型,其返回 object 字符串),而引用类型大部分都不能够被准确检测(除了 Function 类型能够准确返回 function 字符串外,其它的都返回了 object 字符串)。

Object.prototype.toString

Object.prototype.toString返回的 [object class] 字符串中,class 准确的表示了各个数据的类型,例如:

1
2
Object.prototype.toString.call(1) === '[object Number]'  // true
Object.prototype.toString.call({}) === '[object Object]' // true

Object.prototype.toString与 typeof 不同的是,class 所代表的数据类型字符串首字母是大写的,而不像 typeof 返回的是小写字符串。

下面封装一个通用方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/**
* @desc 数据类型检测
* @param obj 待检测的数据
* @return string 类型字符串(小写字符串)
*/
function _isType(obj){
var toString=Object.prototype.toString,
type = {},
types=['Undefined','Null','Boolean','Number','String','Object','Array','Function','Date','RegExp','Error','Arguments'];

types.map(function(item, index){
type["[object " + item + "]"] = item.toLowerCase();
});

return typeof obj !== "object" ? typeof obj : type[toString.call(obj)];
}