在JavaScript中数据类型分为两类,一类是基础数据类型,包括String(字符)、Number(数字)、Boolean(布尔)、null(空)、undefined(未定义)、Symbol(ES6新增),另一类是复杂数据类型 Object。
基本数据类型可以除null外,通过 typeof 检测数据类型,函数也可以检测,如何检测出数据是null还是Object或Array,没有统一的方法进行检测。
在之前的数组类型检测中会用到这样一种方法:
function isArray(obj){
return Object.prototype.toString.call(obj) === '[object Array]' ? true : false;
}
用这个方法就可以区分出Object和Array,同样的null也可以通过这种方法进行判断;
Object.prototype.toString.call(null); // => '[object Null]'
经过尝试发现,不论是基础数据类型还是复杂数据类型,都可以通过这种方法得到相应的字符。如[object String]、[object Number],利用这样的思路,就可以制作出一个工具类,用于判断是否为该类型的数据。
var typeArr = ['Array', 'Set', 'Object', 'Number', 'String', 'Null', 'Undefined', 'Boolean', 'Function', 'Symbol'];
var Type = {};
for (let i = 0, l = typeArr.length; i < l; i++) {
((type) => {
Type['is' + type] = function (value) {
return Object.prototype.toString.call(value) === '[object ' + type + ']'
}
})(typeArr[i]);
}
有了该工具类只能够辨别出相对应的类型,那如何判断某个数据是哪种类型呢。
我这里想到的是对所有的方法循环调用,如果类型符合就返回相应的类型字符。在添加这个属性方法时,该方法是可以访问,但不能够遍历的。
Object.defineProperty(Type, 'typeOf', {
value: function (value) {
var _self = this;
for (let key in _self) {
if (_self[key](value)) {
return key.slice(2);
}
}
return '未知';
}
});
这样就可以使用该工具中封装的方法判断是否为某种数据类型,还可以检测数据具体为哪种类型的。
将方法封装成模块,方便调用。
对方法进行封装,返回对象
var Type = (function () {
var typeArr = ['Array', 'Set', 'Object', 'Number', 'String', 'Null', 'Undefined', 'Boolean', 'Function', 'Symbol'];
var Type = {};
for (let i = 0, l = typeArr.length; i < l; i++) {
((type) => {
Type['is' + type] = function (value) {
return Object.prototype.toString.call(value) === '[object ' +
type + ']'
}
})(typeArr[i]);
}
Object.defineProperty(Type, 'typeOf', {
value: function (value) {
var _self = this;
for (let key in _self) {
if (_self[key](value)) {
return key.slice(2);
}
}
return '未知';
}
});
return Type;
})();
// 实现一个函数,判断数据是什么类型
var checkType = function (checkObj) {
return Type.typeof.call(Type, checkObj);
}
ES6模块
// ES6导出模块
export {Type,checkType};
// ES6引入模块
import {Type,checkType} from './checkType.js'
commonJS模块
// commonJS 导出
module.exports = {
Type,
checkType
}
// commonJS 导入
let {Type,checkType} = require('./checkType.js');
具体代码参考 实现工具类,检测数据类型