JavaScript 中的 Map、WeakMap 和 Set、WeakSet

350 阅读3分钟

MapWeakMapSetWeakSet

WeakMapWeakSet 都是弱引用

1、什么是弱引用

弱引用是指不能确保其引用的对象不会被垃圾回收器回收的引用,换句话说就是可能在任意时间被回收。

弱引用随时都会消失,遍历机制无法保证成员的存在

2、Set

  • 遍历顺序:插入顺序
  • 没有键只有值,可认为键和值两值相等
  • 添加多个 NaN 时,只会存在一个 NaN
  • 添加相同的对象时,会认为是不同的对象
  • 添加值时不会发生类型转换(5 !== "5")
  • keys()values() 的行为完全一致,entries() 返回的遍历器同时包括键和值且两值相等

3、WeakSet

  • Set 结构类似,成员值只能是对象
  • 储存 DOM 节点:DOM 节点被移除时自动释放此成员,不用担心这些节点从文档移除时会引发内存泄漏
  • 临时存放一组对象或存放跟对象绑定的信息:只要这些对象在外部消失,它在 WeakSet 结构中的引用就会自动消
  • 成员都是弱引用,垃圾回收机制不考虑 WeakSet 结构对此成员的引用
  • 成员不适合引用,它会随时消失,因此 ES6 规定 WeakSet 结构不可遍历
  • 其他对象不再引用成员时,垃圾回收机制会自动回收此成员所占用的内存,不考虑此成员是否还存在于 WeakSet 结构中

4、Map

  • 遍历顺序:插入顺序
  • 对同一个键多次赋值,后面的值将覆盖前面的值
  • 对同一个对象的引用,被视为一个键
  • 对同样值的两个实例,被视为两个键
  • 键跟内存地址绑定,只要内存地址不一样就视为两个键
  • 添加多个以 NaN 作为键时,只会存在一个以 NaN 作为键的值
  • Object 结构提供字符串—值的对应,Map 结构提供值—值的对应

5、WeakMap

  • Map 结构类似,成员键只能是对象
  • 储存 DOM 节点:DOM 节点被移除时自动释放此成员键,不用担心这些节点从文档移除时会引发内存泄漏
  • 部署私有属性:内部属性是实例的弱引用,删除实例时它们也随之消失,不会造成内存泄漏
  • 成员键都是弱引用,垃圾回收机制不考虑 WeakMap 结构对此成员键的引用
  • 成员键不适合引用,它会随时消失,因此 ES6 规定 WeakMap 结构不可遍历
  • 其他对象不再引用成员键时,垃圾回收机制会自动回收此成员所占用的内存,不考虑此成员是否还存在于 WeakMap 结构中
  • 一旦不再需要,成员会自动消失,不用手动删除引用
  • 弱引用的只是键而不是值,值依然是正常引用
  • 即使在外部消除了成员键的引用,内部的成员值依然存在

6、Object 转为 Map

let obj = {"a":1, "b":2};
let map = new Map(Object.entries(obj))