JavaScript 中 MapWeakMap 的区别、联系及示例


核心区别
特性MapWeakMap
键的类型允许任意类型的键(对象、原始值)键必须是对象(非原始值)
垃圾回收强引用键 → 阻止垃圾回收弱引用键 → 不影响垃圾回收
可遍历性支持遍历(keys(), values(), entries()不可遍历(无遍历方法)
Size 属性size 属性获取键值对数量size 属性
清除方法clear() 方法clear() 方法
性能频繁增删时内存占用较高内存优化(自动清理无引用键值对)

核心联系
  1. 键值对存储
    二者均为键值对集合:set(key, value) / get(key) / has(key) / delete(key)
  2. 键的唯一性
    键具有唯一性(引用不同的对象视为不同键)

代码示例

1. Map 基本用法
const user = { id: 1 };
const settingsMap = new Map();// 添加任意类型键
settingsMap.set(user, { theme: "dark" });  // ✅ 对象键
settingsMap.set("language", "en");         // ✅ 字符串键console.log(settingsMap.size);           // 2
console.log(settingsMap.get(user));      // { theme: "dark" }// 遍历Map
for (const [key, val] of settingsMap) {console.log(`${key}: ${JSON.stringify(val)}`);
}
2. WeakMap 基本用法
const user = { id: 1 };
const metadata = new WeakMap();metadata.set(user, { lastLogin: "2023-10-05" });  // ✅ 只允许对象键
// metadata.set("role", "admin");                 // ❌ TypeErrorconsole.log(metadata.has(user));     // true
console.log(metadata.get(user));     // { lastLogin: "2023-10-05" }// 当对象被销毁时
user = null;  // 移除对user对象的引用// 垃圾回收后,WeakMap自动删除对应键值对
// metadata.get(user) → undefined (无法直接验证)

高级场景示例

场景 1:Map 的强引用问题
let data = { key: "value" };
const map = new Map();
map.set(data, 1);data = null;  // 移除引用// Map仍保留键值对 → 内存泄漏
console.log([...map.keys()]); // [{ key: "value" }] 
场景 2:WeakMap 解决内存泄漏
let data = { key: "value" };
const weakMap = new WeakMap();
weakMap.set(data, 1);data = null;  // 移除唯一引用// 垃圾回收后,weakMap自动清除键值对
// 无法直接检查,但内存被释放
场景 3:私有属性模拟(WeakMap)
const privateStore = new WeakMap();class User {constructor(name) {// 每个实例关联私有数据privateStore.set(this, { name });}getName() {return privateStore.get(this).name;}
}const alice = new User("Alice");
console.log(alice.getName());  // "Alice" // 外部无法访问私有数据
console.log(alice.name);       // undefined

使用建议

场景推荐原因
需要遍历键/值Map支持遍历操作
存储原始值作为键MapWeakMap 不支持原始值键
管理对象私有数据WeakMap避免内存泄漏,自动清理
临时关联对象与元数据WeakMap对象销毁时自动解除关联
缓存大量长期数据MapWeakMap 无大小控制和遍历能力

核心总结:优先使用 Map 通用场景;选择 WeakMap 需满足 键是对象 + 需自动内存管理 两大条件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/92007.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/92007.shtml
英文地址,请注明出处:http://en.pswp.cn/web/92007.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux 环境 libpq加载异常导致psql 连接 PostgreSQL 库失败失败案例

文章目录局点现象定位结论局点环境补充知识点如下库文件加载顺序关键事实:您系统中的证据:优先级对比表:解决方案强化:最终检查:本局点解决方法局点现象 数据库 mdm 升级失败检查日志, 发现是由于 psql 连接数据库报错…

C# XML 文件

在 C# 中处理 XML 文件是非常常见的操作,可以使用System.Xml命名空间中的类来实现。以下是一些常用的 XML 操作示例: 手册链接: System.Xml 命名空间 XmlDocument 创建一个xml数据格式的文档 XmlDocument xml new XmlDocument(); Xml…

LOVON——面向足式Open-Vocabulary的物体导航:LLM做任务分解、YOLO11做目标检测,最后L2MM将指令和视觉映射为动作(且解决动态模糊)

前言 因为项目需要(比如我们在做的两个展厅讲解订单),近期我一直在研究VLN相关,有些工作哪怕暂时还没开源(将来可能会开源),但也依然会解读,比如好处之一是构建完整的VLN知识体系,本文便是其中一例 我在解读过程中&am…

【Django】-3- 处理HTTP响应

HttpResponse 家族” 的常用操作🌟1. 设置状态码 👋状态码是服务器告诉客户端 “请求处理结果” 的数字暗号(比如 404 表示 “没找到页面”)。Django 里有 3 种设置方式:方式 1:直接写数字(简单…

《React Router深解:复杂路由场景下的性能优化与导航流畅性构建》

路由系统是连接用户操作与应用功能的中枢神经,而React Router作为React生态中处理路由逻辑的核心工具,其在复杂应用中的表现直接决定着用户体验的优劣。当应用规模扩张至数十甚至上百个路由,嵌套层级跨越多层,导航控制中的性能问题便会逐渐凸显——从首屏加载的延迟到路由切…

网络与信息安全有哪些岗位:(4)应急响应工程师

想知道网络与信息安全领域有哪些具体岗位吗? 网络与信息安全有哪些岗位:(1)网络安全工程师-CSDN博客 网络与信息安全有哪些岗位:(2)渗透测试工程师_网络安全渗透工程师-CSDN博客 网络与信息安…

Leetcode 3634. Minimum Removals to Balance Array

Leetcode 3634. Minimum Removals to Balance Array 1. 解题思路2. 代码实现 题目链接:3634. Minimum Removals to Balance Array 1. 解题思路 这一题思路上就是一个滑动窗口的思路。 我们首先将整个数组有序排列,然后分别从左向右考察每一个元素作为…

C#/.NET/.NET Core优秀项目和框架2025年7月简报

前言 每月定期推广和分享的C#/.NET/.NET Core优秀项目和框架(每周至少会推荐两个优秀的项目和框架当然节假日除外),推文中有项目和框架的详细介绍、功能特点、使用方式以及部分功能截图等。注意:排名不分先后,都是十分…

第 10 篇:深度学习的“军火库”——CNN、RNN与Transformer,AI如何看懂世界?

《人工智能AI之机器学习基石》系列⑩ 专栏核心理念: 用通俗语言讲清楚机器学习的核心原理,强调“洞察 + 技术理解 + 应用连接”,构建一个完整的、富有启发性的知识体系。 引

深度学习—功能性函数代码 common.py

函数:返回GPU def try_gpu(i0): #save"""如果存在,则返回gpu(i),否则返回cpu()"""if torch.cuda.device_count() > i 1: # 如果存在第 i 个 GPUreturn torch.device(fcuda:{i}) # 返回第 i 个 GPU 设…

南太平洋金融基建革命:斐济-巴新交易所联盟的技术破局之路 ——从关税动荡到离岸红利,跨境科技如何重塑太平洋资本生态

一、今日焦点:全球关税震荡与南太平洋的“技术联盟”机遇 1. 特朗普关税大限引爆亚太市场波动,小经济体承压寻路 2025年8月1日,特朗普正式签署行政令,对多国征收10%-41%的“对等关税”。韩国首当其冲,综合指数暴跌近4%…

python爬取豆瓣电影评论通用代码

最近在自学python爬虫,今天闲来无事,爬了一下豆瓣数据 这个网站对于初学者来说还是很友好的注意:有python环境的朋友运行的时候,要把cookie换成自己的 通用性:可以自己换不同的电影id进行数据爬取 Tip:slee…

构建属于自己的第一个 MCP 服务器:初学者教程

为什么需要 MCP 服务器? 你是否遇到过这样的场景:向 AI 助手(比如 GitHub Copilot)询问 “北京今天的天气”,得到的回复却是 “我无法访问实时天气数据”? 这是因为大多数 AI 模型本身 “与世隔绝”—— 它…

个人项目介绍:语音识别小助手

一、项目内容 基于STM32F103RCT6制作了一款集语音识别、按键控制、信息显示、温湿度监测等多功能于一体的智能设备,满足多样化的交互需求。 二、个人工作内容 依据项目需求,选定 STM32F103RCT6 单片机、SU-03T语音识别模组、AHT25 温湿度传感器等核心元件…

【Django】-1- 开发项目搭建

一、PDM Django 搭建项目👇🎯 核心目标用 PDM(更现代的 Python 包管理工具),快速创建并管理 Django 项目(Web 框架),让开发流程更丝滑✨🧩 分步拆解1. 创建项目用 PDM 初…

c++:设计模式训练

写一个鸟类:有一个多态函数:run 写一个企鹅类,继承自鸟类:重写 run 写一个鸵鸟类,继承自鸟类,重写 run 写一个老鹰类,继承自鸟类,重写run 写一个鸟笼,能够存放 不同的鸟…

配置Mybatis环境

配置Mybatis环境MyBatis是什么配置Mybatis环境MyBatis是什么 MyBatis 一个支持普通 SQL 查询、存储过程以及高级映射的持久层框架。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作,使得开发者可以更专注于 SQL 本身,而不必花费过多…

生产环境中基于Istio的Kubernetes多集群灰度发布架构实战经验分享

生产环境中基于Istio的Kubernetes多集群灰度发布架构实战经验分享 在大规模分布式微服务架构中,如何在多集群环境下平滑、安全地发布新版本,一直是保证高可用、高可靠的关键需求。本文以真实生产环境案例为基础,分享我们团队基于Istio Servic…

Kubernetes(k8s)之认识Pod

01了解Pod Pod是Kubernetes创建或部署的最小/最简单的基本单位,一个Pod代表集群上正在运行的一个进程。 一个Pod封装一个应用容器(也可以有多个容器),存储资源、一个独立的网络IP以及管理控制容器运行方式的策略选项。它可能由单个容器或多个容器共享组成的资源。 Kubern…

Nginx服务做负载均衡网关

1. 概述 内部Nginx服务器做服务网关,代理后端应用服务,卸载ssl域名证书,将接收的https请求,转发至后端http服务。华为防火墙负责NAT,启用服务器负载均衡功能,将公网虚拟IP端口映射到内部多台Nginx服务器上…