Map、WeakMap 和 Set、WeakSet
WeakMap和WeakSet都是弱引用
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))