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来存储对象相关的额外数据,同时不干扰对象的生命周期。