-
封装基本判断方法
使用 Object.prototype.toString.call()方法判断是因为typeof只能判断基本数据类型,而不能判断一些复杂的引用数据类型,因此我们使用 Object.prototype.toString.call()
const toString = Object.prototype.toString;
export function is(val: unknown, type: string) {
return toString.call(val) === `[object ${type}]`;
}
-
判断值是否定义
export function isDef<T = unknown>(val?:T):val is T{
return typeof val!=='undefined';
}
//相反定义
export function isUnDef<T=unknown>(val:T):val is T{
return !isDef(val);
}
-
判断值是否是字符串
export function isString(val:unknown): val is string {
return is(val,"String")
}
-
判断值是否是Object
要判断Object类型,首先要判断值是否为null类型,因为null和undefined是所有类型的子类型,且在JS中typeof判断null时也是Object所以我们在使用Object.prototype.toString.call()方法判断前要先判断给定的值是否为nul,不能用instanceof是因为instanceof只是查找该对象是否存在原型链上,所以当在查找null和undefined的时候会报错,浏览器会报出不是Object类型错误
export function isObject(val: any):val is Record<any, any> {
return val !== null && is(val, 'Object')
}
-
判断值是否是数组
这里我们直接使用官方提供的Array.isArray()方法判断,在这之前我们还要判断该值是否存
export function isArray(val: any): val is Array<any> {
// 检查数组是否存在如果存在则返回数组的类型
return val && Array.isArray(val)
}
-
判断是否是映射(Map)类型
export function isMap(val: unknown): val is Map<any, any> {
return is(val, 'Map')
}
-
判断值是否为Null
export function isNull(val: unknown):val is null {
return val === null;
}
-
判断值是否是空(长度为0不是Null)
首先我们要判断该值的类型,如果是数组和字符串可以直接通过length方法获取长度进行判断,如果是映射和集合我们可以通过size方法进行判断,如果是对象那么可以通过Object.keys()方法获取对象中所有的key值的数组然后判断该数组长度进行判断
export function isEmpty<T = unknown>(val: T): val is T {
if (isArray(val) || isString(val)) {
return val.length === 0;
}
if (val instanceof Map || val instanceof Set) {
return val.size === 0;
}
if (isObject(val)) {
return Object.keys(val).length === 0;
}
return false;
}
-
判断值是不是函数(Function)
export function isFunction(val: unknown) {
return typeof val === 'function'
}
-
判断值是不是Boolean类型
export function isBoolean(val: any) {
return is(val, 'Boolean')
}
-
判断是不是Number类型
export function isNumber(val: unknown):val is number {
return is(val, 'Number');
}
-
判断值是否是日期类型
export function isDate(val: unknown):val is Date {
return is(val, 'Date');
}
-
判断是不是正则表达式
正则表达式有自己的类型RegExp
export function isRegExp(val: unknown):val is RegExp {
return is(val, 'RegExp');
}
-
判断是不是Url地址
使用正则表达式进行判断
export function isUrl(path: string):boolean {
const reg =
/(((^https?:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+(?::\d+)?|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[\w]*))?)$/;
return reg.test(path);
}
-
判断是不是Promise
export function isPromise<T= any>(val:any):val is Promise<T>{
return is(val,"Promise") && isFunction(val.then) && isFunction(val.catch)
}
-
判断是不是原生JSON字符串
判断该字符串是否以“{”开头,是否以“}”结尾
export function isJsonObjectString(val:string):val is string {
if(!val) return false;
return val.startsWith('{') && val.endsWith('}')
}
-
判断是具有window环境
export function isWindow(val:any):val is Window {
return typeof window !== 'undefined' && is(val,"Window");
}
-
判断是否是浏览器HTMLElement
export function isElement(val:unknown):val is Element {
return isObject(val) && !!val.tagName;
}
-
判断是否是服务器端环境
export const isSever = typeof window === 'undefined';
-
判断是否是客户端环境
export const isClient = !isSever;