news 2026/5/11 19:25:51

`Set`、`Map`、`WeakSet` 和 `WeakMap` 的区别与使用场景

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
`Set`、`Map`、`WeakSet` 和 `WeakMap` 的区别与使用场景

🤍 前端开发工程师、技术日更博主、已过CET6
🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1
🕠牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》、《前端求职突破计划》
🍚蓝桥云课签约作者、上架课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入门到实战全面掌握 uni-app》

在 JavaScript 中,SetMapWeakSetWeakMap是四种重要的数据结构,它们都用于存储键值对或唯一值。虽然它们在某些方面有相似之处,但在内部实现、使用场景和特性上存在显著差异。本文将详细介绍这四种数据结构的区别,并探讨它们各自的最佳使用场景。

一、Set

(一)定义与特性

Set是一个简单的集合数据结构,用于存储唯一的值。它不允许重复的值,因此每个值在集合中只能出现一次。

(二)使用场景

Set适用于以下场景:

  1. 去重:从数组中去除重复值。
  2. 成员检查:快速检查某个值是否存在于集合中。
  3. 集合操作:执行集合的并集、交集和差集操作。

(三)示例代码

constmySet=newSet([1,2,3,3,4]);console.log(mySet);// Set(4) {1, 2, 3, 4}mySet.add(5);console.log(mySet.has(5));// truemySet.delete(3);console.log(mySet);// Set(4) {1, 2, 4, 5}

二、Map

(一)定义与特性

Map是一个键值对的集合,允许使用任意类型的值作为键或值。

(二)使用场景

Map适用于以下场景:

  1. 键值对存储:存储键值对,键可以是任意类型(如对象、函数等)。
  2. 动态属性:为对象动态添加属性,而不需要修改对象本身。
  3. 高效查找:快速查找、插入和删除键值对。

(三)示例代码

constmyMap=newMap();myMap.set("key1","value1");myMap.set({key:"objKey"},"value2");console.log(myMap.get("key1"));// value1console.log(myMap.has({key:"objKey"}));// false(对象引用不同)

三、WeakSet

(一)定义与特性

WeakSet是一个只存储对象引用的集合,这些引用是“弱引用”,不会阻止垃圾回收器自动回收对象。

(二)使用场景

WeakSet适用于以下场景:

  1. 私有属性:为对象添加私有属性,而不影响对象的垃圾回收。
  2. 弱引用管理:管理对象的弱引用,避免内存泄漏。

(三)示例代码

constmyWeakSet=newWeakSet();constobj1={};constobj2={};myWeakSet.add(obj1);console.log(myWeakSet.has(obj1));// trueobj1=null;// obj1 被垃圾回收console.log(myWeakSet.has(obj1));// false(obj1 已被回收)

四、WeakMap

(一)定义与特性

WeakMap是一个键值对的集合,其中键必须是对象,值可以是任意类型。与Map不同,WeakMap的键是弱引用,不会阻止垃圾回收器自动回收对象。

(二)使用场景

WeakMap适用于以下场景:

  1. 私有属性:为对象添加私有属性,而不影响对象的垃圾回收。
  2. 缓存:为对象创建缓存,避免内存泄漏。

(三)示例代码

constmyWeakMap=newWeakMap();constobj1={};constobj2={};myWeakMap.set(obj1,"value1");console.log(myWeakMap.get(obj1));// value1obj1=null;// obj1 被垃圾回收console.log(myWeakMap.get(obj1));// undefined(obj1 已被回收)

五、SetMapWeakSetWeakMap的区别

(一)存储类型

(二)垃圾回收

(三)迭代能力

(四)使用场景

六、总结

SetMapWeakSetWeakMap是 JavaScript 中四种重要的数据结构,它们各自有不同的特性和使用场景。SetMap是常规的数据结构,适用于大多数场景;而WeakSetWeakMap则提供了弱引用机制,适用于需要避免内存泄漏的场景。

在实际开发中,开发者需要根据具体需求选择合适的数据结构。例如,如果需要存储键值对并支持迭代,可以选择Map;如果需要为对象添加私有属性而不影响垃圾回收,可以选择WeakMap。通过合理使用这些数据结构,可以编写出更高效、更可靠的代码。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 16:54:18

力扣解题步骤

核心思路回顾通过哈希表存储「已遍历元素值 → 下标」的映射,遍历数组时计算当前元素的 “补数”(目标值 - 当前值),若补数存在于哈希表中,则直接返回结果;若不存在,将当前元素存入哈希表&#…

作者头像 李华
网站建设 2026/5/11 0:08:10

企业级中小社区疫情信息管理系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】

摘要 近年来,全球范围内的突发公共卫生事件频发,尤其是新冠疫情的暴发,凸显了社区疫情防控信息化建设的重要性。传统社区疫情管理多依赖人工登记和纸质档案,存在效率低、数据共享困难、信息更新滞后等问题,难以应对大规…

作者头像 李华
网站建设 2026/5/11 0:08:20

我发现多中心数据术语冲突 后来用SNOMEDCT编码统一才对齐

📝 博客主页:jaxzheng的CSDN主页 目录医疗数据科学:当Excel表格遇见心跳监测仪 一、从“算术课代表”到医疗数据民工 二、AI诊断系统:当神经网络开始学中医把脉 三、可穿戴设备:当智能手表开始管我吃火锅 四、医疗大数…

作者头像 李华
网站建设 2026/5/11 0:08:06

JVM(JAVA虚拟机内存不足)

这是本人第二次遇到这个问题,打开pycharm还没有Start就撒由那拉了,报出来一堆IDE错误,看都看不懂,上次遇到是大模型的指导改了配置文件依然没解决,这次跟着大佬操作,电脑十分丝滑 步骤(win11&am…

作者头像 李华
网站建设 2026/5/10 21:20:18

类变量和全局变量的生命周期分别是多久?

类变量和全局变量的生命周期核心差异在于创建时机、存活范围、销毁条件,本质由它们的 “归属对象”(类 vs 模块)决定,以下是分维度的精准解析:一、先明确核心前提Python 中变量的生命周期依附于其所属的命名空间对象&a…

作者头像 李华