简述Set、Map、WeakSet 和 WeakMap 的区别 ?

参考回答

SetMapWeakSetWeakMap 是 JavaScript 中的四种常用数据结构,它们的区别如下:
1. Set:存储唯一值的集合,不允许重复元素。
2. Map:存储键值对的集合,键可以是任何数据类型。
3. WeakSet:类似 Set,但其元素是弱引用对象,垃圾回收时不会阻止对象被销毁。
4. WeakMap:类似 Map,但其键是弱引用对象,垃圾回收时键会自动被清除。

详细讲解与拓展

  1. Set
    • Set 用于存储唯一的值。它的元素是无序的,不允许重复值。
    • 可以包含任何类型的数据(包括对象)。
    • Set 主要用于去重和快速查找元素。
    const set = new Set([1, 2, 2, 3]);
    console.log(set); // Set { 1, 2, 3 }
    
  2. Map
    • Map 是一组键值对的集合,类似于对象,但 Map 的键可以是任何数据类型(对象、数组、函数等)。
    • 保持键值对插入的顺序。
    • 常用于需要高效查找、添加、删除键值对的场景。
    const map = new Map();
    map.set('key', 'value');
    console.log(map.get('key')); // value
    console.log(map.size); // 1
    
  3. WeakSet
    • WeakSetSet 类似,但只能存储对象,并且这些对象是弱引用。
    • 如果 WeakSet 中的对象没有其他引用,垃圾回收时该对象会自动被清除。
    • WeakSet 不支持遍历,因为对象可能被垃圾回收。
    const weakSet = new WeakSet();
    const obj = {};
    weakSet.add(obj);
    console.log(weakSet.has(obj)); // true
    
  4. 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 存储键值对,二者都使用强引用。
  • WeakSetWeakMap 使用弱引用,元素或键会在没有其他引用时被垃圾回收。
  • WeakSet 只能存储对象,WeakMap 只能使用对象作为键。

发表评论

后才能评论