JavaScript中Set、Map、WeakSet和WeakMap的特性与应用

Set、Map、WeakSet 和 WeakMap 是 JavaScript 中的四种集合类型,它们各自有不同的用途和特性。以下是对它们的详细解释:
1. Set
Set 是一种集合数据结构,它允许你存储唯一值(无论是原始值还是对象引用)。Set 中的值是无序的,且不会重复。
主要特性:
- 唯一性:
Set中的值不会重复,如果尝试添加一个已经存在的值,操作会被忽略。 - 无序性:
Set中的值没有索引,不能通过索引访问。 - 可迭代:
Set是可迭代的,可以使用for...of循环或forEach方法遍历。
常用方法:
add(value):向Set中添加一个值。delete(value):从Set中删除一个值。has(value):检查Set中是否包含某个值。clear():清空Set中的所有值。size:获取Set中值的数量。
const mySet = new Set();
mySet.add(1);
mySet.add(2);
mySet.add(2); // 重复值,不会被添加
console.log(mySet.size); // 2
console.log(mySet.has(1)); // true
2. Map
Map 是一种键值对的集合,类似于对象,但键可以是任意类型(包括对象),而不仅仅是字符串或符号。
主要特性:
- 键的多样性:
Map的键可以是任意类型,包括对象、函数等。 - 有序性:
Map中的键值对是有序的,按照插入顺序排列。 - 可迭代:
Map是可迭代的,可以使用for...of循环或forEach方法遍历。
常用方法:
set(key, value):向Map中添加一个键值对。get(key):获取指定键对应的值。delete(key):删除指定键的键值对。has(key):检查Map中是否包含某个键。clear():清空Map中的所有键值对。size:获取Map中键值对的数量。
const myMap = new Map();
const keyObj = {};
myMap.set(keyObj, 'value associated with keyObj');
console.log(myMap.get(keyObj)); // 'value associated with keyObj'
console.log(myMap.size); // 1
3. WeakSet
WeakSet 是一种特殊的 Set,它只能存储对象引用,并且这些引用是弱引用,即不会阻止垃圾回收机制回收这些对象。
主要特性:
- 弱引用:
WeakSet中的对象是弱引用,如果没有其他引用指向这些对象,它们会被垃圾回收。 - 不可迭代:
WeakSet不可迭代,没有size属性,也没有clear方法。 - 只能存储对象:
WeakSet只能存储对象,不能存储原始值。
常用方法:
add(value):向WeakSet中添加一个对象。delete(value):从WeakSet中删除一个对象。has(value):检查WeakSet中是否包含某个对象。
const myWeakSet = new WeakSet();
const obj1 = {};
const obj2 = {};
myWeakSet.add(obj1);
myWeakSet.add(obj2);
console.log(myWeakSet.has(obj1)); // true
4. WeakMap
WeakMap 是一种特殊的 Map,它只能使用对象作为键,并且这些键是弱引用,即不会阻止垃圾回收机制回收这些对象。
主要特性:
- 弱引用:
WeakMap中的键是弱引用,如果没有其他引用指向这些键对象,它们会被垃圾回收。 - 不可迭代:
WeakMap不可迭代,没有size属性,也没有clear方法。 - 只能使用对象作为键:
WeakMap的键必须是对象,不能是原始值。
常用方法:
set(key, value):向WeakMap中添加一个键值对。get(key):获取指定键对应的值。delete(key):删除指定键的键值对。has(key):检查WeakMap中是否包含某个键。
const myWeakMap = new WeakMap();
const keyObj = {};
myWeakMap.set(keyObj, 'value associated with keyObj');
console.log(myWeakMap.get(keyObj)); // 'value associated with keyObj'
总结
- Set:用于存储唯一值的集合。
- Map:用于存储键值对的集合,键可以是任意类型。
- WeakSet:用于存储对象的弱引用集合,不可迭代。
- WeakMap:用于存储键值对的集合,键必须是对象且是弱引用,不可迭代。
这些集合类型在不同的场景下有不同的用途,选择合适的集合类型可以提高代码的效率和可维护性。