Set:集合是由一组无序唯一的项组成,可以理解为没有重复元素,没有顺序概念的数组
- 属性:size:返回集合包含元素的个数
- 操作方法
- add(val):添加某个值,返回set本身
- delete(val):删除某个值,返回一个布尔值,表示是否成功
- has(val):返回一个布尔值,表示是否为该set成员
- clear():清除所有成员,没有返回值
const set:Set<number> = new Set([1,2,3])
Map:类似于对象(键值对【key:value】)的形式,但是键的范围不限制于字符串,可以是各种类型的值,操作方法与set相同
const obj = {name:"张三"}
const map:Map<object,Function> = new Map()
map.set(obj,()=> "李四")
WeakSet WeakMap:WeakSet WeakMap的建都是弱引用,不会计入垃圾回收首先obj引用了这个对象 + 1,aahph也引用了 + 1,wmap也引用了,但是不会 + 1,应为他是弱引用,不会计入垃圾回收,因此 obj 和 aahph 释放了该引用 weakMap 也会随着消失的,但是有个问题你会发现控制台能输出,值是取不到的,应为V8的GC回收是需要一定时间的,为了避免这个问题不允许读取键值,也不允许遍历,同理weakSet 也一样
let obj: object | null = { name: "plugin" };
let shph: object | null = obj;
const weakmap: WeakMap<object, any> = new WeakMap();
weakmap.set(obj, "dsad");
obj = null;
shph = null;
setTimeout(() => {
console.log(weakmap);
console.log(weakmap.get(obj));
}, 1000);
typeof:用于获取变量或表达式的类型。它可以返回以下几种类型字符串:"number"、"string"、"boolean"、"symbol"、"undefined"、"object"、"function"。这些类型字符串通常在条件语句中用于类型判断。
instanceof:于判断一个对象是否属于某个类的实例。它会检查对象的原型链,如果对象的原型链中存在指定类的原型,则返回 true,否则返回 false。
自定义守卫
实现一个函数支持任意类型
如果是对象,就检查里面的属性,
如果里面的属性是number就取两位,如果是string就去除左右空格
如果是函数就执行
// ({}) === Object.prototype
const isObj = (arg: any) => ({}.toString.call(arg) === "[object Object]");
const isString = (str: any) => typeof str === "string";
const isNumber = (num: any) => typeof num === "number";
const isFn = (fn: any) => typeof fn === "function";
const fn = (data: any) => {
let value;
if (isObj(data)) {
Object.keys(data).forEach((key) => {
value = data[key];
if (isString(value)) {
//"value."没有属性提示 按我们平常的思维这里是应该有的 因为进到这个判断 那它就一定是string,下面的isNumber也是如此
data[key] = value.trim();
}
if (isNumber(value)) {
data[key] = value.toFixed(2);
}
if (isFn(value)) {
//在js中 函数被单独调用时,函数内部的this会指向全局对象(浏览器下是window,node下是undefined)
value();
}
});
}
};
const obj = {
a: 1111.22222,
b: " plugin ",
c: function ()
console.log(this.a);
return this.a;
},
};
fn(obj);
怎么解决上述问题呢?
const isObj = (arg: any) => ({}.toString.call(arg) === "[object Object]");
// str is string:自定义守卫
const isString = (str: any): str is string => typeof str === "string";
const isNumber = (num: any): num is number => typeof num === "number";
const isFn = (fn: any): fn is Function => typeof fn === "function";
const fn = (data: any) => {
let value;
if (isObj(data)) {
Object.keys(data).forEach((key) => {
value = data[key];
if (isString(value)) {
data[key] = value.trim();
}
if (isNumber(value)) {
data[key] = value.toFixed(2);
}
if (isFn(value)) {
//修改后
data[key]();
}
});
}
};
const obj = {
a: 1111.22222,
b: " plugin ",
c: function () {
console.log(this.a);
return this.a;
},
};
fn(obj);