在 JavaScript 中,Set、Map、WeakSet 和 WeakMap 都是用于存储数据的数据结构,它们之间的区别如下:
一、Set 和 Map
Set(集合):
- 存储内容:Set 存储唯一值,类似于数组,但不允许重复元素。
- 遍历方式:可以使用
for...of
循环、forEach()
方法等进行遍历。 - 操作方法:可以使用
add()
添加元素,delete()
删除元素,has()
检查元素是否存在。 - 示例:
const set = new Set(); set.add(1); set.add(2); set.add(2); // 重复元素不会被添加 console.log(set.has(1)); // true console.log(set.has(2)); // true set.delete(1); console.log(set.has(1)); // false
Map(映射):
- 存储内容:Map 存储键值对,其中键和值可以是任何类型的数据。
- 遍历方式:可以使用
for...of
循环、forEach()
方法等进行遍历,遍历的是键值对。 - 操作方法:可以使用
set()
设置键值对,get()
获取对应键的值,delete()
删除键值对,has()
检查键是否存在。 - 示例:
const map = new Map(); map.set('key1', 'value1'); map.set('key2', 'value2'); console.log(map.get('key1')); // value1 console.log(map.has('key2')); // true map.delete('key2'); console.log(map.has('key2')); // false
二、WeakSet 和 WeakMap
WeakSet:
- 存储内容:WeakSet 只能存储对象引用,并且这些对象是弱引用。如果没有其他强引用指向这些对象,垃圾回收机制可以回收这些对象,WeakSet 中的对应项也会自动被移除。
- 操作方法:可以使用
add()
添加对象,has()
检查对象是否存在,delete()
删除对象。 - 示例:
const weakSet = new WeakSet(); const obj = { }; weakSet.add(obj); console.log(weakSet.has(obj)); // true // 当 obj 没有其他强引用时,垃圾回收机制可能会回收它,WeakSet 中的对应项也会自动被移除
WeakMap:
- 存储内容:WeakMap 的键必须是对象,值可以是任意类型。同样,键是弱引用,当键所对应的对象没有其他强引用时,垃圾回收机制可以回收该对象,WeakMap 中的对应键值对也会自动被移除。
- 操作方法:可以使用
set()
设置键值对,get()
获取对应键的值,delete()
删除键值对,has()
检查键是否存在。 - 示例:
const weakMap = new WeakMap(); const keyObj = { }; weakMap.set(keyObj, 'value'); console.log(weakMap.get(keyObj)); // value // 当 keyObj 没有其他强引用时,垃圾回收机制可能会回收它,WeakMap 中的对应键值对也会自动被移除
综上所述,Set 和 Map 是常规的数据结构,而 WeakSet 和 WeakMap 适用于需要弱引用的场景,以避免内存泄漏问题。