返回

数据结构指南:剖析ES6 Set、Map、WeakSet和WeakMap

前端

Set:无重复元素的集合

Set 是一种无序的集合,它包含唯一且不可重复的值。Set 中的值可以是任何类型,包括对象。

1. 创建Set

// 创建一个空的Set
const set = new Set();

// 向Set中添加元素
set.add('a');
set.add('b');
set.add('c');

// 查看Set中元素的个数
console.log(set.size); // 输出:3

// 检查Set中是否存在某个元素
console.log(set.has('b')); // 输出:true

2. 遍历Set

// 使用forEach循环遍历Set中的元素
set.forEach((value, key) => {
  console.log(value); // 输出:a、b、c
});

// 使用for...of循环遍历Set中的元素
for (const value of set) {
  console.log(value); // 输出:a、b、c
}

3. Set的应用场景

  • 检查元素的唯一性:Set可以用来检查元素是否唯一,这在去重操作中非常有用。
  • 集合运算:Set可以用来进行集合运算,如并集、交集和差集。
  • 存储唯一值:Set可以用来存储唯一值,如用户ID、商品ID等。

Map:键值对的集合

Map是一种有序的键值对集合,它可以将任何类型的值与任何类型的值相关联。

1. 创建Map

// 创建一个空的Map
const map = new Map();

// 向Map中添加键值对
map.set('a', 1);
map.set('b', 2);
map.set('c', 3);

// 查看Map中元素的个数
console.log(map.size); // 输出:3

// 检查Map中是否存在某个键
console.log(map.has('b')); // 输出:true

2. 遍历Map

// 使用forEach循环遍历Map中的键值对
map.forEach((value, key) => {
  console.log(key, value); // 输出:a 1、b 2、c 3
});

// 使用for...of循环遍历Map中的键值对
for (const [key, value] of map) {
  console.log(key, value); // 输出:a 1、b 2、c 3
}

3. Map的应用场景

  • 存储键值对:Map可以用来存储键值对,如用户名和密码、商品ID和商品名称等。
  • 对象的扩展:Map可以用来扩展对象,为对象添加新的属性和方法。
  • 缓存数据:Map可以用来缓存数据,提高应用程序的性能。

WeakSet:无重复元素的弱引用集合

WeakSet是一种无序的弱引用集合,它包含唯一且不可重复的值。WeakSet中的值只能是对象,而不能是其他类型的值。

1. 创建WeakSet

// 创建一个空的WeakSet
const weakSet = new WeakSet();

// 向WeakSet中添加元素
weakSet.add({a: 1});
weakSet.add({b: 2});
weakSet.add({c: 3});

// 查看WeakSet中元素的个数
console.log(weakSet.size); // 输出:3

// 检查WeakSet中是否存在某个元素
console.log(weakSet.has({b: 2})); // 输出:true

2. 遍历WeakSet

// WeakSet中的元素无法直接遍历

3. WeakSet的应用场景

  • 存储弱引用对象:WeakSet可以用来存储弱引用对象,当对象被垃圾回收后,WeakSet中的引用也会被自动删除。
  • 循环检测:WeakSet可以用来检测循环引用,防止内存泄漏。

WeakMap:键值对的弱引用集合

WeakMap是一种有序的键值对弱引用集合,它可以将任何类型的值与任何类型的值相关联。WeakMap中的键只能是对象,而不能是其他类型的值。

1. 创建WeakMap

// 创建一个空的WeakMap
const weakMap = new WeakMap();

// 向WeakMap中添加键值对
weakMap.set({a: 1}, 'a');
weakMap.set({b: 2}, 'b');
weakMap.set({c: 3}, 'c');

// 查看WeakMap中元素的个数
console.log(weakMap.size); // 输出:3

// 检查WeakMap中是否存在某个键
console.log(weakMap.has({b: 2})); // 输出:true

2. 遍历WeakMap

// WeakMap中的元素无法直接遍历

3. WeakMap的应用场景

  • 存储弱引用对象:WeakMap可以用来存储弱引用对象,当对象被垃圾回收后,WeakMap中的引用也会被自动删除。
  • 私有数据:WeakMap可以用来存储私有数据,这些数据只能通过WeakMap的键来访问。