前言
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) // 这里添加重复的key const 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是弱引用, 主要表现在不可枚举, 不影响GC
- 仅提供set/get/has/delete方法, clear方法已被遗弃
- 有遍历操作的使用Map, 不需要遍历的使用WeakMap