强引用和弱引用
强引用(Strong Reference)和弱引用(Weak Reference)是两种不同的引用方式,用于描述对象之间的关联关系和对对象的引用强度。
- 强引用(Strong Reference): 强引用是最常见的引用方式,在 JavaScript 中默认使用的就是强引用。当一个对象具有至少一个强引用时,垃圾回收器将不会回收该对象,即使内存空间紧张。只有当所有对该对象的引用都被解除时,垃圾回收器才会将其标记为可回收,并在适当的时候进行回收。例如:
let obj = { name: "example" }; // 强引用
- 弱引用(Weak Reference): 弱引用是一种比较特殊的引用方式,当一个对象只被弱引用所引用时,垃圾回收器可以自由地回收该对象,即使内存空间未满。弱引用通常用于解决内存泄漏问题或缓存管理。在 JavaScript 中,可以使用
WeakMap和WeakSet数据结构来实现弱引用。例如:
let obj = { name: "example" };
let weakRef = new WeakRef(obj); // 弱引用
在上述示例中,weakRef 是 obj 的弱引用,当 obj 不再有强引用时,垃圾回收器可以自动回收 obj 对象。
弱引用的主要特点是:
- 弱引用不会阻止对象被垃圾回收;
- 弱引用可以在内存不足时优先选择回收;
- 弱引用通常无法直接访问对象,需要通过弱引用对象提供的方法或属性来间接访问。
- 弱引用无法遍历,因为无法在迭代的过程中不会发生对象被回收的情况
- JavaScript 的标准内置对象中,只有
WeakMap和WeakSet这两个数据结构支持弱引用,其他如普通对象、数组等则只能使用强引用
Set和WeakSet
介绍
Set 对象是值的合集(collection),集合(set)中的元素只会出现一次,即集合中的元素是唯一的。
WeakSet对象和Set作用及使用方式基本一致,但其只能存入引用并且是弱引用。常见的方法如下:
const set = new Set([1, 1, 1, 2]);
console.log(set); //Set(2) { 1, 2 }
// 增
set.add(10);
console.log(set); //Set(3) { 1, 2, 10 }
// 删
set.delete(1);
console.log(set); //Set(2) { 2, 10 }
// 查
console.log(set.has(2)); // true
// 遍历
set.forEach(item=>{
console.log(item); // 2 10
})
// 清空
set.clear()
console.log(set); //Set(0) {}
Set和Weak对比
| add | delete | has | clear | forEach | 引用方式 | |
|---|---|---|---|---|---|---|
| Set | ✓ | ✓ | ✓ | ✓ | ✓ | 强引用 |
| WeakSet | ✓ | ✓ | ✓ | ✘ | ✘ | 弱引用 |
Map和WeakMap
WeakMap对象和Map作用及使用方式基本一致,但其只能存入引用并且是弱引用。常见的方法如下:
const keyOne = { name: "keyOne" };
const keyTwo = { name: "keyTwo" };
const map = new Map([
[keyOne, "值1"],
[keyOne, "值1"],
]);
console.log(map); //Map(1) { { name: 'keyOne' } => '值1' }
// 增
map.set(keyTwo, "值2");
map.set(3, "值3");
console.log(map);
//Map(3) { { name: 'keyOne' } => '值1', { name: 'keyTwo' } => '值2', 3 => 值3'}
// 删
map.delete(keyOne);
console.log(map); //Map(2) { { name: 'keyTwo' } => '值2', 3 => '值3' }
// 查
console.log(map.has(keyTwo)); //true
// 遍历
map.forEach((item,key) => {
console.log(item); // 值2 值3
console.log(key); // { name: 'keyTwo' } 3
});
// 清空
map.clear();
console.log(map); //Map(0) {}
Map和WeakMap对比
| set | delete | has | clear | forEach | 引用方式 | |
|---|---|---|---|---|---|---|
| Map | ✓ | ✓ | ✓ | ✓ | ✓ | 强引用 |
| WeakMap | ✓ | ✓ | ✓ | ✘ | ✘ | 弱引用 |