Map和WeakMap的区别

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

let bar = { name: 'zs' }
const weakmap = new WeakMap()
weakmap.set(bar, '456')
bar = null
console.log('weakmap ====>', weakmap.get(bar))  // weakmap ====> undefined