WeakMap对象的使用

262 阅读2分钟

前言

WeakMap 从名称上就可以看出, 弱类型的Map, 在使用上和Map对象大同小异

WeakMap是不可枚举的, 也就是不提供任何用于遍历的方法. 正是因为这个特性, 它存储的数据不会在其他地方被引用, 从而影响GC回收

WeakMap的键只能是引用类型, 不能是基本类型(包括symbol、bigint). 当然, 其value值可以是任意类型

具体说明,参考官方中文文档

WeakMap方法

和Map不同, WeakMap其不提供size属性获取长度, 也不提供任何用于遍历的方法

set(key, value)

  • 作用:添加或设置新的键值对

  • 参数:key 键(引用类型);value 值(任意类型)

  • 返回值:WeakMap对象

    const map = new WeakMap()
    const person = { uname: 'zhangsan', uage: 18 }
    ​
    map.set(person, person)
    // 返回值为当前WeakMap对象, 因为不可枚举, 打印也就没有意义了
    // 主要是用于链式操作
    

get(key)

  • 作用:获取指定元素

  • 参数:key 指定元素的键

  • 返回值:指定元素的value值

    const map = new WeakMap()
    const person = { uname: 'zhangsan', uage: 18 }
    ​
    map.set(person, 'test').set(person, person)  // 这里添加重复的keyconst value = map.get(person)
    console.log(value);
    // { uname: 'zhangsan', uage: 18 }
    // 重复的key会覆盖旧值
    

has(key)

  • 作用:判断weakmap 中是否存在指定元素

  • 参数:key 要检测的元素键

  • 返回值:Boolean

    const map = new WeakMap()
    const person = { uname: 'zhangsan', uage: 18 }
    ​
    map.set(person, person)
    ​
    console.log(map.has(person))
    // true
    

delete(key)

  • 作用:删除指定元素

  • 参数:key 要删除的元素键

  • 返回值:Boolean

    const map = new WeakMap()
    const person = { uname: 'zhangsan', uage: 18 }
    ​
    map.delete(person)
    console.log(map.has(person));
    // false
    

其他测试

// 重复键会覆盖, 在set方法中测试了// 测试非引用类型的键
const map = new WeakMap()
map.set('foo', 'bar') // error
map.set(Symbol(), 'symbol') // error

参考

WeakMap

总结

  • 键值对方式进行存储
  • WeakMap是弱引用, 主要表现在不可枚举, 不影响GC
  • 仅提供set/get/has/delete方法, clear方法已被遗弃
  • 有遍历操作的使用Map, 不需要遍历的使用WeakMap