介绍下 Set、Map、WeakSet 和 WeakMap 的区别?

发布于 2024-09-04 12:52:40 字数 3032 浏览 26 评论 0

SetMapWeakSetWeakMap 都是 JavaScript 中用于存储集合数据的对象,但它们在行为、存储特性和应用场景上有所不同。下面详细介绍它们的区别:

1. Set

  • 定义 : Set 是一种类似于数组的数据结构,用于存储唯一值的集合。
  • 特点 :
  • 值是唯一的,即不能重复。
  • 值可以是任何类型(基本类型和引用类型)。
  • 提供了 adddeletehasclear 等方法来操作集合。
  • 可以通过迭代器(如 for...of 循环)遍历 Set 中的元素,按插入顺序访问。
  • 使用场景 :
  • 去重操作:从数组中去除重复项。
  • 存储需要保证唯一性的值。
const set = new Set();
set.add(1);
set.add(2);
set.add(2); // 重复的值不会被添加
console.log(set); // 输出: Set { 1, 2 }

2. Map

  • 定义 : Map 是一种键值对集合,类似于对象,但 Map 的键可以是任意类型。
  • 特点 :
  • 键和值可以是任意类型(对象、基本类型)。
  • 提供了 setgetdeletehas 等方法来操作键值对。
  • 可以通过迭代器遍历 Map 的键值对,按插入顺序访问。
  • Map 的键值对数量可以通过 size 属性获取。
  • 使用场景 :
  • 需要键为复杂类型(如对象)的键值对存储。
  • 存储数据时,需要按插入顺序遍历或操作。
const map = new Map();
const keyObj = { a: 1 };
map.set(keyObj, 'value associated with keyObj');
console.log(map.get(keyObj)); // 输出: 'value associated with keyObj'

3. WeakSet

  • 定义 : WeakSet 是一个类似 Set 的集合,但只能存储对象,并且这些对象是“弱引用”的。
  • 特点 :
  • 只能存储对象(不能存储原始类型的值)。
  • 对象是弱引用的,如果没有其他引用指向对象,该对象会被垃圾回收机制自动回收。
  • WeakSet 不能遍历,因为对象随时可能被回收,无法确定集合的长度或顺序。
  • 使用场景 :
  • 用于存储一组对象,但不干扰垃圾回收(例如用于跟踪对象的状态)。
  • 比如,跟踪已处理的 DOM 元素,避免内存泄漏。
let obj = { a: 1 };
const weakSet = new WeakSet();
weakSet.add(obj);
console.log(weakSet.has(obj)); // 输出: true
obj = null; // 现在 obj 可能会被垃圾回收

4. WeakMap

  • 定义 : WeakMap 是一种类似 Map 的键值对集合,但键只能是对象,且键是“弱引用”的。
  • 特点 :
  • 键必须是对象(不能是原始类型)。
  • 对象键是弱引用的,键对象若没有其他引用,会被垃圾回收机制自动回收。
  • WeakMap 不能遍历,因为键随时可能被回收,无法确定集合的长度或顺序。
  • WeakMap 也没有 size 属性。
  • 使用场景 :
  • 用于存储与对象相关联的数据而不会阻止对象被垃圾回收。
  • 常用于私有数据存储,比如关联对象的私有属性。
let obj = { a: 1 };
const weakMap = new WeakMap();
weakMap.set(obj, 'some value');
console.log(weakMap.get(obj)); // 输出: 'some value'
obj = null; // 现在 obj 可能会被垃圾回收,weakMap 中的键值对也会被移除

总结

  • Set 和 Map : 适用于常规集合存储,支持任意类型的值/键,且可以遍历。
  • WeakSet 和 WeakMap : 适用于管理对象引用,不会阻止对象被垃圾回收,且无法遍历。

选择哪个数据结构,通常取决于你是否需要存储对象以及是否需要考虑内存管理与垃圾回收。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

0 文章
0 评论
23 人气
更多

推荐作者

linfzu01

文章 0 评论 0

可遇━不可求

文章 0 评论 0

枕梦

文章 0 评论 0

qq_3LFa8Q

文章 0 评论 0

JP

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文