WeakMap和WeakSet的理解
WeakMap和WeakSet是ES6中新增的两种数据结构,它们的主要特点是其成员都是弱引用。这意味着,当某个对象在WeakMap或WeakSet中作为键或成员存在时,如果这个对象在外部没有其他引用,那么它会被垃圾回收机制自动清理,而不需要手动删除。
文末有我帮助400多位同学成功领取到前端offer的场景题哦
-
WeakMap:
- 类似于Map,但是键只能是对象类型,且键名所指向的对象是弱引用。
- 如果这个对象在其他地方没有被引用,那么它将会被垃圾回收,这是WeakMap的主要应用场景。
- WeakMap不接受其他类型的值作为键名,且其键名所指向的对象不计入垃圾回收机制。
- WeakMap不能遍历,提供的方法有get, set, has, delete。
-
WeakSet:
- 类似于Set,但成员只能是对象类型,且成员对象是弱引用。
- 如果这个对象在其他地方没有被引用,那么它将会被垃圾回收,这是WeakSet的主要应用场景。
- WeakSet内部只能存放对象类型的数据,不能存放其他类型的数据。
- WeakSet里的对象是弱引用,即垃圾回收机制不会考虑该对象的引用,若外面已经没有该对象的引用了,则垃圾回收机制会回收该对象,WeakSet内部引用的该对象也会自动消失。
- WeakSet不能遍历,提供的方法有add, delete, has。
WeakMap和WeakSet与普通Map和Set的区别
-
键/成员类型:
- WeakMap的键只能是对象类型,不接受其他类型的值作为键名;而Map的键可以是任意类型。
- WeakSet的成员只能是对象类型,不接受其他类型的数据;而Set的成员可以是任意类型。
-
引用方式:
- WeakMap和WeakSet的成员都是弱引用,即如果对象在外部没有其他引用,它们会被垃圾回收机制自动清理。
- 而Map和Set的成员是强引用,即使没有其他引用,也需要手动删除。
-
遍历性:
- WeakMap和WeakSet都不能遍历。
- 而Map和Set都可以遍历,提供了多种遍历方法。
-
应用场景:
- WeakMap和WeakSet通常用于存储一些临时的对象或DOM节点,当外部该对象的引用消失了,WeakMap和WeakSet内部该对象的引用也自动消失了,不用担心内存泄漏。
- Map和Set则更多地用于数据重组和数据储存等场景。