map和weakMap的区别

news2025/2/12 10:50:28

MapWeakMap 都是 JavaScript 中用于存储键值对的数据结构,但它们在设计目的、行为和使用场景上有一些重要的区别。

在这里插入图片描述

以下是 MapWeakMap 之间的主要差异:

1. 键的类型

  • Map:可以使用任何类型的值作为键,包括原始类型(如字符串、数字)和对象。

    let map = new Map();
    let keyObj = { id: 1 };
    let keyFunc = function() {};
    
    map.set(1, 'number');
    map.set('string', 'text');
    map.set(keyObj, 'object');
    map.set(keyFunc, 'function');
    
  • WeakMap:只能使用对象作为键,不能使用原始类型(如字符串、数字等)作为键。

    let weakMap = new WeakMap();
    let keyObj = { id: 1 };
    
    weakMap.set(keyObj, 'object'); // OK
    weakMap.set(1, 'number');      // TypeError: Invalid value used in weak map
    

2. 垃圾回收机制

  • Map:键值对中的键不会被自动垃圾回收,即使该键不再被其他地方引用,只要它存在于 Map 中,它就不会被回收。

  • WeakMap:键值对中的键是弱引用,这意味着如果一个对象只被 WeakMap 引用而没有其他引用,那么这个对象可以被垃圾回收。这有助于防止内存泄漏,尤其是在处理大量临时对象时。

3. 迭代和操作

  • Map:提供了丰富的 API 来进行遍历和操作,如 keys()values()entries()forEach() 等方法,允许你轻松地遍历键、值或键值对。

    for (let [key, value] of map.entries()) {
      console.log(key + " = " + value);
    }
    
  • WeakMap:没有提供迭代器,也没有 keys()values()entries()forEach() 方法。因此,WeakMap 的内容无法直接遍历。这限制了 WeakMap 的使用场景,但它也确保了对象的私有性,因为外部代码无法枚举 WeakMap 的键。

4. 默认大小

  • Map:可以通过 size 属性获取当前 Map 中存储的键值对数量。

    console.log(map.size); // 输出 Map 中的元素个数
    
  • WeakMap:没有 size 属性,也无法直接查询 WeakMap 中有多少个键值对,因为它的键是弱引用的,可能会随时被垃圾回收。

5. 使用场景

  • Map:适用于需要显式管理和遍历键值对的场景,比如缓存、字典查找、关联数组等。

  • WeakMap:适用于需要与对象关联一些元数据而不阻止这些对象被垃圾回收的场景。例如,你可以使用 WeakMap 来为 DOM 元素附加一些私有数据,当这些元素从文档中移除时,相关的 WeakMap 条目也会自动被清理,避免内存泄漏。

6. 构造函数参数

  • Map:可以接受一个可迭代对象(如数组)作为构造函数的参数来初始化 Map

    let map = new Map([
      [1, 'one'],
      ['two', 2],
      [{id: 3}, 'three']
    ]);
    
  • WeakMap:构造函数不接受任何参数,必须逐个添加键值对。

    let weakMap = new WeakMap();
    weakMap.set({id: 1}, 'data');
    

总结来说,Map 更适合于通用的键值对存储需求,而 WeakMap 则更适合于需要与对象关联一些不会影响对象生命周期的数据的场景。选择使用哪一个取决于你的具体需求和应用场景。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【专题】2024年悦己生活消费洞察报告汇总PDF洞察(附原数据表)

原文链接: https://tecdat.cn/?p38654 在当今时代背景下,社会发展日新月异,人们的生活方式与消费观念正经历深刻变革。MoonFox 月狐数据的《2024 年悦己生活消费洞察报告》聚焦于这一充满活力与变化的消费领域。随着就业、婚姻等社会压力的…

OpenCV-Python实战(5)——图形绘制基础

一、直线 cv2.line(img*,pt1*,pt2*,color*,thickness*,lineTypeLINE_8) img:绘图的背景(画布)。 pt1、pt2:始/终点坐标,格式为元组()。 color:直线颜色,BGR格式。 t…

[原创](Modern C++)现代C++的第三方库的导入方式: 例如Visual Studio 2022导入GSL 4.1.0

[简介] 常用网名: 猪头三 出生日期: 1981.XX.XX 企鹅交流: 643439947 个人网站: 80x86汇编小站 编程生涯: 2001年~至今[共23年] 职业生涯: 21年 开发语言: C/C、80x86ASM、PHP、Perl、Objective-C、Object Pascal、C#、Python 开发工具: Visual Studio、Delphi、XCode、Eclipse…

vue3----思维导图

介绍:这是一个前端思维导图展示的插件,以及下载svg功能,内部用的scss,不一样的需要改一下,整体也没写太复杂。 效果: 依赖: {"markmap-common": "^0.14.2","markmap…

.NET 8.0 项目升级到 .NET 9.0

本文项目从.NETCore3.1开始一直延续到目前,如果您没有升级过,请参考以下文章: .Net Core 2.2 升级到 .Net Core 3.1:https://blog.csdn.net/hefeng_aspnet/article/details/131259537 NetCore3.1或Net6.0项目升级到Net7.0&#x…

第23天:信息收集-APP应用产权渠道服务资产通讯抓包静态提取动态调试测试范围

#知识点 1、信息收集-APP应用-公开信息-知识产权&开发者定位 2、信息收集-APP应用-资产信息-抓包&静态提取&动态调试 一、APP渗透测试的范围->应涵盖APP所有功能和组件,包括但不限于以下几个方面: 1、前端安全:包括界面交互、…

Virtualbox安装ubuntu20虚拟机无法打开终端

用Virtualbox安装ubuntu20系统,安装好之后,无法打开终端; 原因:语言设置导致的问题; 修改方法:将/etc/default/locale里LANG这行的值修改为:en_US.UTF-8即可; 步骤:先在…

PH热榜 | 2024-12-25

1. Assistive24 标语:为残障人士提供的免费辅助技术 介绍:Assistive24 是一款免费的 Chrome 浏览器扩展程序,可以帮助患有注意力缺陷多动障碍 (ADHD)、阅读障碍 (dyslexia) 和低视力等障碍的用户更方便地浏览网页。它提供语音导航、自定义…

Torch.gather

1.官方文档 2.使用要点 输入index的shape等于输出value的shape输入index的索引值仅替换该index中对应dim的index值最终输出为替换index后在原tensor中的值 最终输出的shape和index的shape相同 根据dim的值 选择将index[i,j,k]这个结果替换input[i,j,k]里面对应的i or j or…

Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现马赛克效果,Kotlin(3)

Android使用PorterDuffXfermode模式PorterDuff.Mode.SRC_OUT橡皮擦实现马赛克效果,Kotlin(3) import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory import android.graphics.Canvas impor…

音乐极客的新玩具:香橙派Zero3快速搭建Melody个人音乐平台

文章目录 前言1. 添加镜像源2. 本地部署Melody3. 本地访问与使用演示4. 安装内网穿透5. 配置Melody公网地址6. 配置固定公网地址 前言 今天要给喜欢听音乐的朋友们介绍一个超酷的DIY项目,在香橙派Zero3上使用Melody搭建自己的个人在线音乐平台,并且借助…

如何从 0 到 1 ,打造全新一代分布式数据架构

导读:本文从 DIKW(数据、信息、知识、智慧) 模型视角出发,探讨数字世界中数据的重要性问题。接着站在业务视角,讨论了在不断满足业务诉求(特别是 AI 需求)的过程中,数据系统是如何一…

elementPlus消息组件多按钮案例

let customClass zsl-el-message-box efb.messageBox({title: 操作提示,showConfirmButton: false,customClass,message: efb.VNode(div, null, [efb.VNode(style, null, .${customClass} .el-message-box__message {width: 100%;}),efb.VNode(div, null, hello world),efb.VN…

MATLAB符号计算-符号表达式基础运算操作

1.1.2符号变量取值域的限定 默认复数域 【例1-1-2】解不等式 1.1.3创建符号表达式 对符号对象进行各种运算(算术运算、关系运算、逻辑运算),即可创建符号表达式。 1.算术运算与转置 【例1-1-3】 f5是f4的共轭转置 f6是f4的转置 2.关系…

使用Excel制作通达信自定义外部数据,安排!!!

Excel相信大家电脑上都有这个工具,相比敲编程代码,用这个去做自定义数据对大多数人,应该是比较友好的。自定义数据分为外部序列数据,看了一下内容理解起来比较多,分两期给大家介绍。为了照顾电脑基础薄弱的朋友&#x…

SwiftUI 入门趣谈:在文本框(TextField)内限制数字的输入

概述 虽然 SwiftUI 本身提供了海量内置的原生视图供我们使用,但对于某些情况我们还需要根据实际需求“量体裁衣、专属定制”。 在日常的撸码场景中,我们有时需要限制文本框(TextField)中数字内容的输入,如何又简单又快…

深入浅出 MyBatis | CRUD 操作、配置解析

3、CRUD 3.1 namespace namespace 中的包名要和 Dao/Mapper 接口的包名一致! 比如将 UserDao 改名为 UserMapper 运行发现抱错,这是因为 UserMapper.xml 中没有同步更改 namespace 成功运行 给出 UserMapper 中的所有接口,接下来一一对…

基于c语言的union、字符串、格式化输入输出

结构体之共用体union 共用体也叫联合体,其关键词为union 与结构体不同的是,共用体所开辟的存储空间仅仅为其中最长类型变量的存储空间而不是全部变量的存储空间,由于同一内存单元在同一时间内只能存放其中一种的数据类型,因此在每…

IntelliJ Idea常用快捷键详解

文章目录 IntelliJ Idea常用快捷键详解一、引言二、文本编辑与导航1、文本编辑2、代码折叠与展开 三、运行和调试四、代码编辑1、代码补全 五、重构与优化1、重构 六、使用示例代码注释示例代码补全示例 七、总结 IntelliJ Idea常用快捷键详解 一、引言 在Java开发中&#xff…

AI开发:使用支持向量机(SVM)进行文本情感分析训练 - Python

支持向量机是AI开发中最常见的一种算法。之前我们已经一起初步了解了它的概念和应用,今天我们用它来进行一次文本情感分析训练。 一、概念温习 支持向量机(SVM)是一种监督学习算法,广泛用于分类和回归问题。 它的核心思想是通过…