在计算机程序中,弱引用与强引用相对,是指不能确保其引用的对象不会被垃圾回收器回收的引用。一个对象若只被弱引用所引用,则被认为是不可访问的(或弱访问的),并因此可能在任何时刻被回收
Map
Map
它类似于对象,也是键值对的集合,并且能够记住键的原始插入顺序。任何值(对象或者基本类型)都可以作为一个键或一个值。
实例属性和方法
- Map实例支持size属性: 返回Map结构中的成员数目数量
- set(key, value)方法: 设置Key所对应的键值,然后返回整个Map结构
- get(key)方法: 读取key对应的键值,如果找不到key,返回undefined
- has(key)方法: 返回一个布尔值,表示某个键是否在Map结构中
- delete(key)方法: 删除某个键,返回true,删除失败返回false
- clear()方法: 清除所有成员,没有返回值
WeakMap
WeakMap
对象是一组键/值对的集合,其中的键是弱引用的。其键必须是对象,而值可以是任意的。
弱引用
// Map 强引用
let obj = {
name: "kite",
};
const map = new Map();
map.set(obj, "value");
obj = null;
// WeakMap 弱引用
let obj2 = {
name: "smile",
};
const weakMap = new WeakMap();
weakMap.set(obj2, "weak");
obj2 = null;
控制台结果:
Map 为强引用,将obj置为null并不会使 { name: kite } 被垃圾回收,因为还有map引用了 { name: kite };
WeakMap 为弱引用,不会阻止垃圾回收, 直到垃圾回收器移除了键对象的引用; 任何值都可以被垃圾回收 只要它们的键对象没有被 WeakMap
以外的地方引用
WeakMap与Map的区别
- WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。
- WeakMap的键名所指向的对象不计入垃圾回收机制(不阻止垃圾回收)。它的键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内。因此所引用的对象的其他引用都被清除,垃圾回收站就会释放该对象所占用的内存。
- WeakMap没有遍历操作(即没有keys()、values()和entries()方法),也没有size属性。
- WeakMap无法清空,即不支持clear()方法。
实例方法
- delete(key)
- get(key)
- has(key)
- set(key, value)
Set
类似于数组,但是成员的值都是唯一的,没有重复。Set 本身是一个构造函数,用来生成Set数据结构
实例属性和方法
- add(value): 添加某个值,返回Set结果本身
- delete(value): 删除某个值,返回一个布尔值,表示删除是否成功
- has(value): 返回一个布尔值,表示参数是否为Set成员
- clear(value): 清除所有成员,没有返回值
遍历方法
- keys(): 返回键名的遍历器
- values(): 返回键值的遍历器
- entries(): 返回键值对的遍历器
- forEach(): 使用回调函数遍历每个成员
WeakSet
WeakSet
对象允许你将弱保持对象存储在一个集合中。
它和 Set 对象的主要区别有:
WeakSet
只能是对象的集合,而不能像 Set 那样,可以是任何类型的任意值。WeakSet
持弱引用(和 WeakMap 同理):集合中对象的引用为弱引用。如果没有其它的对WeakSet
中对象的引用,那么这些对象会被当成垃圾回收掉。- WeakSet是弱引用,在其内部有多少个成员取决于垃圾回收机制有没有运行, 运行前后很可能成员个数是不一样的,而垃圾回收机制何时运行是不可预测的,因此es6规定weakSet是不可遍历的。
实例方法
- add(value)
- delete(value)
- has(value)