js高阶Set与WeakSet的使用

92 阅读2分钟

Set(强引用)

四个操作方法:

  • Set.prototype.add(value):添加某个值,返回 Set 结构本身。
  • Set.prototype.delete(value):删除某个值,返回一个布尔值,表示删除是否成功。
  • Set.prototype.has(value):返回一个布尔值,表示该值是否为Set的成员。
  • Set.prototype.clear():清除所有成员,没有返回值。

四个遍历方法:

  • Set.prototype.keys():返回键名遍历器
  • Set.prototype.values():返回键值遍历器
  • Set.prototype.entries():返回键值对遍历器
  • Set.prototype.forEach():使用回调函数遍历每个成员
 // 1.创建Set (强引用)
    const set = new Set()  //创建后数组里面内容与内容地址是强引用不会销毁
    //添加元素
    set.add(10)
    set.add(20)
    set.add(30)
    
    const info  = {}
    const obj = {name:'obj'}
    //添加对象
    set.add(info)
    set.add(obj)
    
    // 数组去重
    const names  = ['abc','bcd','cde','efg','abc']
   const setname  =  new Set(names)  //set数组
   const setname2  =  [...setname] 
   const setname3  =  Array.from(setname)

  //  console.log("setname",setname);
  //  console.log("setname2",setname2);
  //  console.log("setname3",setname3);

   // set其他属性和方法
    console.log("set",set)
    console.log("set.size",set.size)  //查看大小
    set.delete(info)  //删除
    console.log("set.has(info)",set.has(info)); //查看当前数组里是否有当前元素
    console.log("set.has(info)",set.has(obj)); //查看当前数组里是否有当前元素

    set.forEach(item=>console.log("item",item))  //循环

    // set支持 for...of...
    for (const iterator of set) {
       console.log("for...of...",iterator);
    }
    console.log("set.size",set)

WeakSet(弱引用)

WeakSet 不能遍历,是因为成员都是弱引用,随时可能消失

WeakSet 结构有以下三个方法。

  • WeakSet.prototype.add(value):向 WeakSet 实例添加一个新成员。
  • WeakSet.prototype.delete(value):清除 WeakSet 实例的指定成员。
  • WeakSet.prototype.has(value):返回一个布尔值,表示某个值是否在WeakSet 实例之中。
// 1.Weak Reference(弱引用)和Strong Reference(强引用)
    let obj1 = { name: "why" }
    let obj2 = { name: "kobe" }
    let obj3 = { name: "jame" }

    // let arr = [obj1, obj2, obj3]
    // obj1 = null
    // obj2 = null
    // obj3 = null

    // const set = new Set(arr) //arr里面的内容引用地址是强引用 不会销毁
    // arr = null

    // 2.WeakSet的用法
    // 2.1.和Set的区别一: 只能存放对象类型
    const weakSet = new WeakSet()  //创建数据里内容的引用地址是弱引用 外部未使用会被认为没有使用 会进行销毁
    weakSet.add(obj1)
    weakSet.add(obj2)
    weakSet.add(obj3)

    console.log("weakSet",weakSet);
    // 2.2.和Set的区别二: 对对象的引用都是弱引用


    // 3.WeakSet的应用
    const pWeakSet = new WeakSet()
    class Person {
      constructor() {
        console.log("this",this);
        pWeakSet.add(this)
      }

      running() {
        if (!pWeakSet.has(this)) {
          console.log("Type error: 调用的方式不对")
          return
        }
        console.log("running~")
      }
    }

    let p = new Person()
    // p = null
    p.running()
    const runFn = p.running
    runFn()
    const obj = { run: runFn }
    obj.run()

区别

  • WeakSet 的成员只能是对象,而不能是其他类型的值。
  • WeakSet 中的对象都是弱引用