js数据类型分为:原始类型(即基本数据类型)和对象类型(即引用数据类型)
es6中新增了: Set、Map、Symbol
类型判断使用:typeof、Object.prototype.toString.call、instanceof,本文中只使用前2种方式
类型方法封装
// 对象中是否包含某个属性
const hasOwnProperty$1 = Object.prototype.hasOwnProperty;
const hasOwn = (val, key) => hasOwnProperty$1.call(val, key);
// 通过object原型上的toString方法判断对象类型
const objectToString = Object.prototype.toString;
const toTypeString = (value) => objectToString.call(value);
// 是否数组
const isArray = Array.isArray;
// 是否map对象
const isMap = (val) => toTypeString(val) === "[object Map]";
// 是否set对象
const isSet = (val) => toTypeString(val) === "[object Set]";
// 是否日期对象
const isDate = (val) => toTypeString(val) === "[object Date]";
// 是否正则对象
const isRegExp = (val) => toTypeString(val) === "[object RegExp]";
// 是否函数
const isFunction = (val) => typeof val === "function";
// 是否字符串类型
const isString = (val) => typeof val === "string";
// 是否symbol类型
const isSymbol = (val) => typeof val === "symbol";
// 是否object类型
const isObject = (val) => val !== null && typeof val === "object";
// 是否promise对象类型
const isPromise = (val) => {
return isObject(val) && isFunction(val.then) && isFunction(val.catch);
};
// 对象类型(string、number、object、map等)
const toRawType = (value) => {
return toTypeString(value).slice(8, -1);
};
// 是否绝对对象类型
const isPlainObject = (val) => toTypeString(val) === "[object Object]";
案例
// 案例
let obj1 = {
name: 'namevalue',
title: 'titlevalue'
}
// 1、是否包含name属性
console.log('是否包含name属性 == ', hasOwn(obj1, 'name')); // true
// 2、是否包含name1属性
console.log('是否包含name1属 == ', hasOwn(obj1, 'name1')); // false
// 3、是否数组判断
console.log('[]是否数组', isArray([{name:1}])); // true
console.log('{} 是否数组', isArray({name:1})); // false
// 4、map判断
let map1 = new Map();
console.log('Map判断', isMap(map1)); // true
console.log('Map2判断', isMap({name:1})); // false
// 5、set判断
let set1 = new Set();
console.log('Set 判断', isSet(set1)); // true
console.log('Set2 判断', isSet([])); // false
// 6、Date判断
console.log('Date对象判断', isDate(new Date('2021-10-11 14:22:20'))); // true
console.log('Date 2对象判断', isDate('2021-10-11 14:22:20')); // false
// 7、正则表达式
console.log('正则表达式', isRegExp(/0-9/)); // true
console.log('正则表达式2', isRegExp('/0-9/')); // false
console.log('正则表达式2', isRegExp(new RegExp('0-9', 'g'))); // true
// 8、方法函数判断
let fun1 = ()=>{}
console.log('方法函数判断', isFunction(new Function())); // true
console.log('方法函数判断2', isFunction(fun1)); // true
// 字符串类型判断
console.log('字符串类型判断', isString(123)); // false
console.log('字符串类型判断2', isString('123')); // true
console.log('字符串类型判断3', isString(new String('123'))); // false, 基本字符串类型判断, new String为对象所以false
// 9、Symbol类型判断
let symbol1 = Symbol(1);
console.log('Symbol类型判断', isSymbol(symbol1)); // true
// 10、是否Object
console.log('[] 是否Object类型判断', isObject([])); // true
console.log('{} 是否Object类型判断', isObject({})); // true
console.log('new Date 是否Object类型判断', isObject(new Date())); // true
console.log('123 是否Object类型判断', isObject('123')); // false
// 11、是否真正对象{}为true
console.log('[] 是否对象类型判断', isPlainObject([])); // false
console.log('{} 是否对象类型判断', isPlainObject({})); // true
console.log('new Date 是否对象类型判断', isPlainObject(new Date())); // false
console.log('123 是否对象类型判断', isPlainObject(new String('123'))); // false
// 12、对象对应的类型
console.log('[] 类型', toRawType([])); // Array
console.log('{} 类型', toRawType({})); // Object
console.log('new Date 类型', toRawType(new Date())); // Date
console.log(' "123" 类型', toRawType(new String('123'))); // String
console.log('new String 类型', toRawType('123')); // String
console.log('123 类型', toRawType(123)); // Number
console.log('fun1 类型', toRawType(fun1)); // Function
console.log('symbol1 类型', toRawType(symbol1)); // Symbol
// 13、是否isPromise对象
console.log('fun1 是否Promise类型', isPromise(fun1)); // false
let promise1 = new Promise(function(){})
console.log('promise1 是否Promise类型', isPromise(promise1)); // true