JavaScript存在两套类型系统:一套是基本数据类型,另一套是对象类型系统。基本数据类型在ES6中包括7种,分别是undefined、null、boolean、string、number、object和symbol。基本数据类型是通过typeof来检测的。对象类型系统是以基础类型系统为基础的,通过 instanceof来检测。然而,JavaScript自带的这两套识别机制非常不靠谱,于是催生了isXXX系列。
判定变量类型的工具
const toString = Object.prototype.toString;
const is = (type) => {
return (value) => {
return toString.call(value) == `[object ${type}]`;
};
};
// const is = (type) => (value) => toString.call(value) == `[object ${type}]`;
const types = ['Undefined', 'Null', 'Boolean', 'String', 'Number', 'Object', 'Symbol'];
const typeUtil = types.reduce((util, type) => {
util[`is${type}`] = is(type);
return util;
}, {});
const undefinedValue = undefined;
const stringValue = '';
const nullValue = null;
const booleanValue = true;
const numberValues = [0, NaN, Infinity];
const objectValue = {};
const symbolValue = Symbol();
console.group('test typeUtil.isUndefined');
console.log('undefinedValue', typeUtil.isUndefined(undefinedValue));
console.log('stringValue', typeUtil.isUndefined(stringValue));
console.log('nullValue', typeUtil.isUndefined(nullValue));
console.log('booleanValue', typeUtil.isUndefined(booleanValue));
console.log('numberValues', numberValues.map(typeUtil.isUndefined));
console.log('objectValue', typeUtil.isUndefined(objectValue));
console.log('symbolValue', typeUtil.isUndefined(symbolValue));
console.groupEnd();
console.log('------');
console.group('test typeUtil.isNull');
console.log('undefinedValue', typeUtil.isNull(undefinedValue));
console.log('stringValue', typeUtil.isNull(stringValue));
console.log('nullValue', typeUtil.isNull(nullValue));
console.log('booleanValue', typeUtil.isNull(booleanValue));
console.log('numberValues', numberValues.map(typeUtil.isNull));
console.log('objectValue', typeUtil.isNull(objectValue));
console.log('symbolValue', typeUtil.isNull(symbolValue));
console.groupEnd();
console.log('------');
console.group('test typeUtil.isBoolean');
console.log('undefinedValue', typeUtil.isBoolean(undefinedValue));
console.log('stringValue', typeUtil.isBoolean(stringValue));
console.log('nullValue', typeUtil.isBoolean(nullValue));
console.log('booleanValue', typeUtil.isBoolean(booleanValue));
console.log('numberValues', numberValues.map(typeUtil.isBoolean));
console.log('objectValue', typeUtil.isBoolean(objectValue));
console.log('symbolValue', typeUtil.isBoolean(symbolValue));
console.groupEnd();
console.log('------');
console.group('test typeUtil.isString');
console.log('undefinedValue', typeUtil.isString(undefinedValue));
console.log('stringValue', typeUtil.isString(stringValue));
console.log('nullValue', typeUtil.isString(nullValue));
console.log('booleanValue', typeUtil.isString(booleanValue));
console.log('numberValues', numberValues.map(typeUtil.isString));
console.log('objectValue', typeUtil.isString(objectValue));
console.log('symbolValue', typeUtil.isString(symbolValue));
console.groupEnd();
console.log('------');
console.group('test typeUtil.isNumber');
console.log('undefinedValue', typeUtil.isNumber(undefinedValue));
console.log('stringValue', typeUtil.isNumber(stringValue));
console.log('nullValue', typeUtil.isNumber(nullValue));
console.log('booleanValue', typeUtil.isNumber(booleanValue));
console.log('numberValues', numberValues.map(typeUtil.isNumber));
console.log('objectValue', typeUtil.isNumber(objectValue));
console.log('symbolValue', typeUtil.isNumber(symbolValue));
console.groupEnd();
console.log('------');
console.group('test typeUtil.isObject');
console.log('undefinedValue', typeUtil.isObject(undefinedValue));
console.log('stringValue', typeUtil.isObject(stringValue));
console.log('nullValue', typeUtil.isObject(nullValue));
console.log('booleanValue', typeUtil.isObject(booleanValue));
console.log('numberValues', numberValues.map(typeUtil.isObject));
console.log('objectValue', typeUtil.isObject(objectValue));
console.log('symbolValue', typeUtil.isObject(symbolValue));
console.groupEnd();
console.group('test typeUtil.isSymbol');
console.log('undefinedValue', typeUtil.isSymbol(undefinedValue));
console.log('stringValue', typeUtil.isSymbol(stringValue));
console.log('nullValue', typeUtil.isSymbol(nullValue));
console.log('booleanValue', typeUtil.isSymbol(booleanValue));
console.log('numberValues', numberValues.map(typeUtil.isSymbol));
console.log('objectValue', typeUtil.isSymbol(objectValue));
console.log('symbolValue', typeUtil.isSymbol(symbolValue));
console.groupEnd();