js是弱类型的语言,它的变量没有类型约束,我们可以组合使用如下5个工具来做类型判断。
- typeof。判断字符串,函数,Symbol。
- instanceof。能检测出引用类型,判断日期
- Array.isArray。判断数组
- Object.prototype.toString.call。判断其他没有专门工具判断的数据类型,例如 Map, Set, Object等。
- constructor 除了null和undefined都可以判断
区别和优缺点:
优点 缺点
Object.prototype.toString.cal 检测出所有的类型 IE6下,undefined和null均为Object
如下代码是从vue3的源码中摘录的。可以参考使用。
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) => val instanceof Date;
// 是否函数
const isFunction = (val) => typeof val === 'function';
// 是否字符串
const isString = (val) => typeof val === 'string';
// 是否Symbol
const isSymbol = (val) => typeof val === 'symbol';
// 是否对象(不能是nul)
const isObject = (val) => val !== null && typeof val === 'object';
// 是否Promise
const isPromise = (val) => {
return isObject(val) && isFunction(val.then) && isFunction(val.catch);
};
// 工具方法:获取类型字符串
const toRawType = (value) => {
// extract "RawType" from strings like "[object RawType]"
return toTypeString(value).slice(8, -1);
};
// 是否纯对象
const isPlainObject = (val) => toTypeString(val) === '[object Object]';
// 是否是整数字符串
const isIntegerKey = (key) => isString(key) &&
key !== 'NaN' &&
key[0] !== '-' &&
'' + parseInt(key, 10) === key;