一、WeakSet和Set
共同点:是不重复值的集合。
区别有二:
WeakSet成员只能是对象,否则向其中add会报错。
WeakSet 中的对象都是弱引用,即垃圾回收机制不考虑 WeakSet 对该对象的引用,也就是说,如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存。
一个变量被置为null,就意味着这个变量的内存可以被回收了。只要 WeakSet 结构中的对象不再需要被引用,那么 WeakSet 就直接为空了,这不就意味着WeakSet中的数据所占据的内存被释放了吗。
不使用 WeakSet 存放数据,当变量obj为null时,fistName依旧是有值的。所以什么是强引用?就是创建引用之后,无法被垃圾资源回收机制进行回收的,就是强引用。强到你设置了null,也分不开。
对比这段代码,我们可以清晰的看出, WeakSet中 - 垃圾回收机制会自动回收该对象所占用的内存
垃圾回收机制有一套自己的回收算法,我们都知道一个函数执行完成后该函数在调用栈中创建的执行上下文会被销毁,这里说的销毁,其实指的就是执行上下文中环境变量、词法变量中的数据存储所占据的内存空间被垃圾回收机制所回收。
应用场景:储存 DOM 节点,而不用担心这些节点从文档移除时,会引发内存泄漏。
二、WeakMap和Map
共同点:都是用于生成键值对的集合。
区别:WeakMap的key 只能是对象。WeakMap 弱引用的只是键名,而不是键值。在 weakMap 中使用一个对象作为键,并且没有其他对这个对象的引用,该对象将会被从内存中自动清除。所以,WeakMap 的 key 是不可枚举的。
let obj = { name: 'fedaily' }
const weakmap = new WeakMap()
weakmap.set(obj, 'account') // WeakMap的key必须是对象,具体用法这里不展开,可以看MDN上的介绍
console.log(weakmap.get(obj)) // 'account'
obj = null // 这里将obj置为null
console.log(weakmap.get('obj')) // undefined 这里就没有了 当一个对象被回收后,相关的弱引用也会自动消失
应用场景:WeakMap 的主要应用场景是 额外数据的存储、缓存数据