简述Set、Map、WeakSet 和 WeakMap 的区别 ?
参考回答
Set、Map、WeakSet 和 WeakMap 是 JavaScript 中的四种常用数据结构,它们的区别如下:
1. Set:存储唯一值的集合,不允许重复元素。
2. Map:存储键值对的集合,键可以是任何数据类型。
3. WeakSet:类似 Set,但其元素是弱引用对象,垃圾回收时不会阻止对象被销毁。
4. WeakMap:类似 Map,但其键是弱引用对象,垃圾回收时键会自动被清除。
详细讲解与拓展
- Set:
Set用于存储唯一的值。它的元素是无序的,不允许重复值。- 可以包含任何类型的数据(包括对象)。
Set主要用于去重和快速查找元素。
const set = new Set([1, 2, 2, 3]); console.log(set); // Set { 1, 2, 3 } - Map:
Map是一组键值对的集合,类似于对象,但Map的键可以是任何数据类型(对象、数组、函数等)。- 保持键值对插入的顺序。
- 常用于需要高效查找、添加、删除键值对的场景。
const map = new Map(); map.set('key', 'value'); console.log(map.get('key')); // value console.log(map.size); // 1 - WeakSet:
WeakSet与Set类似,但只能存储对象,并且这些对象是弱引用。- 如果
WeakSet中的对象没有其他引用,垃圾回收时该对象会自动被清除。 WeakSet不支持遍历,因为对象可能被垃圾回收。
const weakSet = new WeakSet(); const obj = {}; weakSet.add(obj); console.log(weakSet.has(obj)); // true - WeakMap:
WeakMap是一组键值对的集合,键是弱引用。- 只有对象类型的键才可以用于
WeakMap。 - 当键没有其他引用时,它会被自动垃圾回收,因此
WeakMap不会阻止对象的销毁。 WeakMap不能遍历,也没有size属性。
const weakMap = new WeakMap(); const obj = {}; weakMap.set(obj, 'value'); console.log(weakMap.get(obj)); // value obj = null; // 键被垃圾回收
总结
- Set 存储唯一值,Map 存储键值对,二者都使用强引用。
- WeakSet 和 WeakMap 使用弱引用,元素或键会在没有其他引用时被垃圾回收。
WeakSet只能存储对象,WeakMap只能使用对象作为键。