const toString = Object.prototype.toString;
// 各种类型
export function is(val: unknown, type: string) {
return toString.call(val) === `[object ${type}]`;
}
// undefined
export function isDef<T = unknown>(val?: T): val is T {
return typeof val !== 'undefined';
}
// !undefined
export function isUnDef<T = unknown>(val?: T): val is T {
return !isDef(val);
}
//Object
export function isObject(val: any): val is Record<any, any> {
return val !== null && is(val, 'Object');
}
// ''
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;
}
//Date
export function isDate(val: unknown): val is Date {
return is(val, 'Date');
}
//null
export function isNull(val: unknown): val is null {
return val === null;
}
// underfind && null
export function isNullAndUnDef(val: unknown): val is null | undefined {
return isUnDef(val) && isNull(val);
}
export function isNullOrUnDef(val: unknown): val is null | undefined {
return isUnDef(val) || isNull(val);
}
// Number
export function isNumber(val: unknown): val is number {
return is(val, 'Number');
}
// promise
export function isPromise<T = any>(val: unknown): val is Promise<T> {
return is(val, 'Promise') && isObject(val) && isFunction(val.then) && isFunction(val.catch);
}
// string
export function isString(val: unknown): val is string {
return is(val, 'String');
}
// function
export function isFunction(val: unknown): val is Function {
return typeof val === 'function';
}
// Boolean
export function isBoolean(val: unknown): val is boolean {
return is(val, 'Boolean');
}
// RegExp
export function isRegExp(val: unknown): val is RegExp {
return is(val, 'RegExp');
}
// isArray
export function isArray(val: any): val is Array<any> {
return val && Array.isArray(val);
}
// window
export function isWindow(val: any): val is Window {
return typeof window !== 'undefined' && is(val, 'Window');
}
// element
export function isElement(val: unknown): val is Element {
return isObject(val) && !!val.tagName;
}
// ismap
export function isMap(val: unknown): val is Map<any, any> {
return is(val, 'Map');
}
export const isServer = typeof window === 'undefined';
export const isClient = !isServer;
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);
}
js中有六种数据类型,包括五种基本数据类型(Number,String,Boolean,Undefined,Null),和一种复杂数据类型(Object)。
typeof 操作符
由于js中的变量是松散类型的,所以它提供了一种检测当前变量的数据类型的方法,也就是typeof关键字.
typeof 123 //Number
typeof 'abc' //String
typeof true //Boolean
typeof undefined //Undefined
typeof null //Object
typeof { } //Object
typeof [ ] //Object
typeof console.log() //Function
null类型进行typeof操作符后,结果是object,原因在于,null类型被当做一个空对象引用。
1.Number类型
Number类型包含整数和浮点数(浮点数数值必须包含一个小数点,且小数点后面至少有一位数字)两种值。
NaN:非数字类型。特点:① 涉及到的 任何关于NaN的操作,都会返回NaN ② NaN不等于自身。
isNaN() 函数用于检查其参数是否是非数字值。
isNaN(123) //false isNaN("hello") //true
2.String类型
字符串有length属性。
字符串转换:转型函数String(),适用于任何数据类型(null,undefined 转换后为null和undefined);toString()方法(null,defined没有toString()方法)。
3.Boolean类型
该类型只有两个值,true和false
4.Undefined类型
只有一个值,即undefined值。使用var声明了变量,但未给变量初始化值,那么这个变量的值就是undefined。
5.Null类型
null类型被看做空对象指针,前文说到null类型也是空的对象引用。
6.Object类型
js中对象是一组属性与方法的集合。这里就要说到引用类型了,引用类型是一种数据结构,用于将数据和功能组织在一起。引用类型有时候也被称为对象定义,因为它们描述的是一类对象所具有的属性和方法。
三大引用类型
1.Object类型
我们看到的大多数类型值都是Object类型的实例,创建Object实例的方式有两种。
第一种是使用new操作符后跟Object构造函数,如下所示
var person = new Object();
person.name = "Micheal";
person.age = 24;
第二种方式是使用对象字面量表示法,如下所示
var person = {
name : "Micheal",
age : 24
};
2.Array类型
数组的每一项可以用来保存任何类型的数据,也就是说,可以用数组的第一个位置来保存字符串,第二个位置来保存数值,第三个位置保存对象....另外,数组的大小是可以动态调整的。
创建数组的基本方式有两种
第一种是使用Array构造函数,如下所示
var colors = new Array("red","blue","yellow");
第二种是使用数组字面量表示法,如下所示
var colors = ["red","blue","yellow"];
3 Function类型
每个函数都是Function类型的实例,而且都与其他引用类型一样具有属性和方法。函数通常是使用函数声明语法定义的,如下所示
function sum(num1,num2){
return num1 + num2;
};
这和使用函数表达式定义函数的方式相差无几。
var sun = function (){
return sum1 + sum2;
};
也就是说,js按照存储方式分为值类型和引用类型。那么他们的计算有什么区别呢?
题目1: var a = 100;
var b = a;
a = 200;
console.log (b);
题目2: var a = {age : 20};
var b = a;
b.age = 21;
console.log (a.age);
题目1的答案是 100,题目2的答案是21,