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:用于存储键值对的集合,键必须是对象且是弱引用,不可迭代。
这些集合类型在不同的场景下有不同的用途,选择合适的集合类型可以提高代码的效率和可维护性。