深入理解ES6中的Set、Map、WeakMap和WeakSet

96 阅读2分钟

ES6(ECMAScript 2015)为JavaScript引入了一些新的数据结构,其中包括Set、Map、WeakMap和WeakSet。这些数据结构为开发者提供了更多灵活的选项来处理数据,但它们各自有不同的用途和特点。让我们深入探讨这些数据结构,并通过代码示例来理解它们的用途和区别。

Set(集合)

Set是一种无重复值的数据结构,它允许您存储各种数据类型,包括原始值和对象。一个Set不会包含重复的值,这使得它非常适合用于去重操作。

const uniqueNumbers = new Set();

uniqueNumbers.add(1);
uniqueNumbers.add(2);
uniqueNumbers.add(1); // 重复值不会被添加

console.log(uniqueNumbers); // 输出: Set { 1, 2 }

Map(映射)

Map是键-值对的集合,其中键可以是任何数据类型,而值也可以是各种数据类型。这使得Map非常适合用于存储和检索数据,其中每个值都与一个唯一的键相关联。

const person = new Map();

person.set('name', 'John');
person.set('age', 30);

console.log(person.get('name')); // 输出: John

WeakSet(弱引用集合)

WeakSet是一种特殊类型的Set,它只能包含对象。与Set不同,WeakSet的成员是弱引用,这意味着它们不会阻止对象被垃圾回收。

let obj1 = { name: 'Alice' };
let obj2 = { name: 'Bob' };
const weakSet = new WeakSet();

weakSet.add(obj1);
weakSet.add(obj2);

obj1 = null; // obj1 不再引用对象

// 此时,obj1 对应的对象可以被垃圾回收
**WeakMap(弱引用映射)**

WeakMap类似于Map,但它的键是弱引用,值可以是任何数据类型。这使得它适用于需要将额外数据与对象关联,同时不会阻止这些对象被垃圾回收的情况。

```javascript
let user1 = { id: 1 };
const userMap = new WeakMap();

userMap.set(user1, { name: 'Alice' });

user1 = null; // user1 不再引用对象

// 此时,user1 对应的对象可以被垃圾回收

区别和应用场景

  • 使用Set进行去重操作,保存一组唯一的值。
  • 使用Map进行键-值存储,以便高效地检索和更新数据。
  • 使用WeakSet来存储对象的弱引用,当对象不再需要时,不会阻止它们被回收。
  • 使用WeakMap来存储对象相关的额外数据,同时不干扰对象的生命周期。