当前位置: 首页 > news >正文

`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。通过合理使用这些数据结构,可以编写出更高效、更可靠的代码。

http://www.cnnetsun.cn/news/142724.html

相关文章:

  • Android架构师面试指南:基于跨越速运职位要求的全面解析与参考答案
  • 【2025最新】基于SpringBoot+Vue的企业项目管理系统管理系统源码+MyBatis+MySQL
  • 企业级大学生考勤系统管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 【2025最新】基于SpringBoot+Vue的物资综合管理系统管理系统源码+MyBatis+MySQL
  • 数学梗图数据集分析报告:999张高质量数学主题幽默图片资源
  • 【毕业设计】SpringBoot+Vue+MySQL 美食信息推荐系统平台源码+数据库+论文+部署文档
  • AI核心知识59——大语言模型之Mamba(简洁且通俗易懂版)
  • SpringBoot+Vue 流浪动物救助平台平台完整项目源码+SQL脚本+接口文档【Java Web毕设】
  • SpringBoot+Vue 手机销售网站管理平台源码【适合毕设/课设/学习】Java+MySQL
  • DPJ-138 基于单片机的指纹密码锁系统设计(源代码+proteus仿真)
  • SpringBoot+Vue 流浪动物救助平台管理平台源码【适合毕设/课设/学习】Java+MySQL
  • 【2025最新】基于SpringBoot+Vue的考试系统管理系统源码+MyBatis+MySQL
  • 企业级流浪动物救助平台管理系统源码|SpringBoot+Vue+MyBatis架构+MySQL数据库【完整版】
  • 物资综合管理系统信息管理系统源码-SpringBoot后端+Vue前端+MySQL【可直接运行】
  • MLX 有多快?在 8 个苹果硅芯片和 4 个 CUDA GPU 上的全面基准测试
  • 生产就绪特性-从开发到部署的完整解决方案
  • 【前端知识点总结】Promise的介绍
  • 2026年河北省职业院校技能大赛“网络系统管理”(高职组)系统服务-Linux部署样题
  • 当 AI 写论文遭遇 “答辩级拷问”:9 款主流工具的生死考验
  • 科研人的 “数据魔咒”:明明数据在手,却挖不出核心结论
  • [特殊字符] 写论文软件哪个好?先看毕业党最在意的 4 大核心标准
  • 历年贵州大学计算机保研复试机试真题
  • AI产业融合纵深发展,治理创新护航智能未来
  • 生成式AI重构内容生态,人机协同定义创作新范式
  • 软件世界的契约:理解开源协议的逻辑与边界
  • vue和springboot框架开发的小程序 智能包裹配送服务管理系统_q3k407ra
  • C 语言输入与输出(I/O)详解
  • 软件测试成本的多维解析与优化路径
  • 5-脱氧-L-阿拉伯糖—结构独特的稀有单糖,药物设计与合成化学的宝贵砌块 CAS:13039-56-0
  • 2-乙酰胺基-1,3,4,6-四-O-乙酰基-2-脱氧-5-硫代-α-D-吡喃葡萄糖 —— 糖化学与药物研发的关键砌块 CAS:67561-97-1