typescript weakMap weakSet set map typeof instanceof

61 阅读3分钟

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);