- 首先,Map 和 WeakMap 都属于 ES6 中新增的数据类型,用于存储键值对。
- Map 是一个普通的键值对集合,可以使用任何类型的值作为键或值,包括基本类型和对象。而 WeakMap 的键必须是对象,值可以是任何类型
- Map 中的键值对是强引用关系,即只要 Map 中的键或值存在,Map 对象就会一直保留这个键值对,不会被垃圾回收。而 WeakMap 中的键值对是弱引用关系,如果 WeakMap 的键不再被引用,那么这个键值对就会被自动删除。
- 由于 WeakMap 中的键是弱引用,所以 WeakMap 对象的 size 属性无法访问,也无法使用 forEach() 和 clear() 等方法。
- WeakMap 对象的主要应用场景是需要与另外一个对象关联,并且不想影响到这个对象的垃圾回收机制,以避免内存泄漏。例如,将对象存储在 WeakMap 中,可以确保这个对象只在其他地方仍然被引用时才被保留,否则会自动被删除,从而避免内存泄漏。
let foo = { name: 'zs' }
const map = new Map()
map.set(foo, '123')
foo = null
console.log('map ====>', map.size)
let bar = { name: 'zs' }
const weakmap = new WeakMap()
weakmap.set(bar, '456')
bar = null
console.log('weakmap ====>', weakmap.get(bar))