(十四)Set、WeakSet、Map、WeakMap

70 阅读3分钟

强引用和弱引用

强引用(Strong Reference)和弱引用(Weak Reference)是两种不同的引用方式,用于描述对象之间的关联关系和对对象的引用强度。

  1. 强引用(Strong Reference): 强引用是最常见的引用方式,在 JavaScript 中默认使用的就是强引用。当一个对象具有至少一个强引用时,垃圾回收器将不会回收该对象,即使内存空间紧张。只有当所有对该对象的引用都被解除时,垃圾回收器才会将其标记为可回收,并在适当的时候进行回收。例如:
   let obj = { name: "example" }; // 强引用
  1. 弱引用(Weak Reference): 弱引用是一种比较特殊的引用方式,当一个对象只被弱引用所引用时,垃圾回收器可以自由地回收该对象,即使内存空间未满。弱引用通常用于解决内存泄漏问题或缓存管理。在 JavaScript 中,可以使用 WeakMapWeakSet 数据结构来实现弱引用。例如:
    let obj = { name: "example" };
    let weakRef = new WeakRef(obj); // 弱引用

在上述示例中,weakRefobj 的弱引用,当 obj 不再有强引用时,垃圾回收器可以自动回收 obj 对象。

弱引用的主要特点是:

  • 弱引用不会阻止对象被垃圾回收;
  • 弱引用可以在内存不足时优先选择回收;
  • 弱引用通常无法直接访问对象,需要通过弱引用对象提供的方法或属性来间接访问。
  • 弱引用无法遍历,因为无法在迭代的过程中不会发生对象被回收的情况
  • JavaScript 的标准内置对象中,只有 WeakMapWeakSet 这两个数据结构支持弱引用,其他如普通对象、数组等则只能使用强引用

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对比

adddeletehasclearforEach引用方式
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对比

setdeletehasclearforEach引用方式
Map强引用
WeakMap弱引用