Map和WeakMap对象的用法(JS)

news2024/10/7 14:23:07

📝个人主页:爱吃炫迈
💌系列专栏:数据结构与算法
🧑‍💻座右铭:道阻且长,行则将至💗

文章目录

  • 🌸Map
    • key
    • 创建map的其他方式
    • Map常用方法
    • Map结构原生提供三个遍历器生成函数和一个遍历方法
    • Map和Object的区别
  • 🌸WeakMap
    • WeakMap常用方法
    • WeakMap设计目的
    • 强引用,弱引用
  • 🌸总结


🌸Map

Map是一个键值对形式的集合,类似object,区别是Map允许任何的键(key)

key

举例一些key

const map = new Map();
let obj = {
    name: "jack",
    age: 18,
};
map.set("1", "字符串");
map.set(2, "数字");
map.set(["3"], "数组");
map.set(obj, "对象");
map.set(true, "布尔值");

console.log(map);

结果如下

Snipaste_2023-05-07_20-22-35

注意:在object中无法使用对象作为键使用,但是在map中对象是可以作为key使用

创建map的其他方式

创建map的时候,可以传入一个带有键值对的数组或者可迭代对象进行初始化

代码演示

const map = new Map([
    ["a", 1],
    ["b", 2],
    ["c", 3],
]);

console.log(map);

image-20230507210202020

const obj = {
    name: "jack",
    age: "12",
};

const map = new Map(Object.entries(obj));
console.log(map);

image-20230507211234310

Map常用方法

new Map()创建map
map.set(key,value)存储键值对
map.get(key)根据key获取value,没有返回undefined
map.has(key)是否存在key,存在返回true,反之为false
map.delete(key)根据key删除指定项
map.clear()清空map
map.size返回长度

代码演示

const map = new Map();

map.set("1", "字符串");
map.set(2, "数字");
//等价于
map.set("1", "字符串").set(2, "数字");

map.get("1"); //字符串
map.get(2); //数字

map.has("1"); //true
map.has(2); //true

map.delete("1");
map.get("1"); //undefined

console.log(map.size);//1

注意:根据上述代码我们发现map与对象不同,map的键不会被转成字符串,键保存是什么类型,get就是什么类型

Map结构原生提供三个遍历器生成函数和一个遍历方法

map.keys()遍历返回所有的key
map.values()遍历返回所有的value
map.entries()遍历返回数组,以“key:value”的形式
forEach遍历Map所有成员

代码演示

const map = new Map();

map.set("1", "字符串").set(2, "数字");

console.log(map.keys());
// 输出:{ '1', 2 }
console.log(map.values());
// 输出:{ '字符串', '数字' }
console.log(map.entries());
// 输出:{ [ '1', '字符串' ], [ 2, '数字' ] }
map.forEach((value, key, map) => {
  console.log(`${key}:${value}`);
});
/**
 * 输出:
 * 1:字符串
 * 2:数字
 */

Map和Object的区别

MapObject
意外的键Map默认情况下不包含任何键,只包含显式插入的键Object有一个原型,原型链上的键名有可能和自己在对象上设置的键名产生冲突
键的类型Map的键可以是任意值,包含函数、对象或任意基本类型Object的键必须是String或Symbol
键的顺序Map中key是有序的。因此,当迭代的时候,Map对象以插入的顺序返回键值Object的键是无序的
SizeMap键值对的个数可以轻易地通过size属性获取Object的键值对个数只能手动计算
迭代Map是可迭代的,所以可以直接被迭代迭代Object需要以某种方式获取它的键然后才能迭代
性能在频繁增删键值对的场景下表现良好在频繁增删键值对的场景下未作出优化

🌸WeakMap

WeakMap对象也是一组键值对的集合,其中键是弱引用的。其键必须是对象,原始数据类型不能作为key值,而值可以是任意的

WeakMap常用方法

new WeakMap()创建WeakMap
WeakMap.set(key,value)存储键值对
WeakMap.get(key)根据key获取value,没有返回undefined
WeakMap.has(key)是否存在key,存在返回true,反之为false
WeakMap.delete(key)根据key删除指定项,删除成功返回true,反之返回false

代码演示

const weakmap = new WeakMap();

let m = { m: 1 };
let n = { n: 2 };
weakmap.set(m, "1");
weakmap.set(n, 2);
// 等价于
weakmap.set(m, "1").set(n, 2);

weakmap.get(m); //"1"
weakmap.get(n); //2

weakmap.has(m); //true
weakmap.has(s); //s is not defined

weakmap.delete(m);
weakmap.get(m); //undefined

WeakMap结构如下
在这里插入图片描述

WeakMap设计目的

  1. 有时想在某个对象上存放一些数据,但是这会形成对于这个对象的引用。一旦不再需要这两个对象,就必须手动删除这个引用,否则垃圾回收机制就不会是的对象占用的内存
  2. 而WeakMap的键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内。因此,只需要引用的对象的其他引用都被清除,垃圾回收机制就会释放的该对象所占用的内存。也就是说,一旦不再需要,WeakMap里面的键名和所对应的键值对会自动消失,不用手动删除引用

此时有点迷迷,强引用和弱引用又是什么鬼
在这里插入图片描述

强引用,弱引用

再来解释一下强引用和弱引用

强引用:A牵着一条狗,他们之间通过狗链连着


弱引用:B指着A牵的狗,说:嘿,那有条狗,B指向那条狗,但他们之间没有是绑在一起的东西


当A放开狗链,无论B是不是还指着,狗都会跑掉(被垃圾回收器回收)


当B不再指着那条狗,狗还被A牵着,不会影响它是否跑掉

妙啊,直接悟了
在这里插入图片描述
悟了也得看下面的解释,不然我白写了
在这里插入图片描述

  • 强引用:将一个引用类型数据通过变量/常量保存,这个变量/常量就是强引用。

  • 特点: 不会被垃圾回收器回收,可能导致内存无法释放,造成内存泄漏。

  • 方法:将全部引用该对象的变量关系都设置为null,这个对象就会被垃圾回收器回收。

var obj = { x: 1, y: 2 };

// 只要访问obj对象(或者任何其他引用指向该对象),这个对象就不会被垃圾回收

obj = null;
// obj设为null,obj就会被被垃圾回收器回收
  • 弱引用:没有通过变量/常量和引用地址进行联系,有着更短暂的生命周期。

  • 特点: 会时刻被垃圾回收器回收,不会导致内存泄漏

  • 方法: WeakMap和WeakSet

let wm = new WeakMap();
let wobj = { x : 1 };
wm.set( wobj, '2' );
wobj = null; 

// 说明:wobj为null后,键不存在,即为弱引用,{ x : 1 } 会被垃圾回收器回收

🌸总结

  • Map数据结构。它类似于对象,也是键值对的集合,但是==“键”的范围不限于字符串,各种类型的值(包括对象)都可以当做键==。
  • WeakMap结构与Map结构类似,也是用于生成键值对的集合。但是WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名。而且WeakMap的键名所指向的键名不计入垃圾回收机制

希望我的文章对你学习Map和WeakMap有所帮助!

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

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

相关文章

项目成本管理

定义:项目各个成本的总和 作用:在预算范围内完成项目 考点: 直接成本是指一个由项目组承担的费用,例如员工的工资,电脑等硬件费用。 间接成本是指由多个项目组承担的费用,例如租金,水电费&am…

社交媒体中的“点赞”“喜欢”是如何存储在数据库中的?

你有没有想过 Instagram、Twitter、Facebook 或任何社交媒体平台如何跟踪谁喜欢你的帖子?让我们在这篇文章中弄清楚! 1:序言 最近,我受邀在一个名为“CityJS”的活动中发言。但问题在于:我是 PHP 开发人员。我根本不懂…

Palo Alto Networks利用基于机器学习的自动化网络安全解决方案

“ Palo Alto Networks利用第三代英特尔至强可扩展处理器和部署在云中的英特尔软件,为其云端安全服务提供强有力的支持,从而提升机器学习和推断的性能。 面对恶意软件攻击的快速演变和难以捉摸的特性,企业网络安全团队面临着巨大的挑战。恶意…

"五步走"的MES系统改进战略,让ERP不再是面子工程

随着制造业信息化进程的不断推进,大部分的制造业企业都开始意识到,生产技术的领先和生产流程的有效管理是其发展的重要一环,有些企业已经或者正在实施的 ERP系统。但是,从相关部门的数据来看, ERP在分散型制造业企业中…

算法(一)—— 回溯(1)

文章目录 前言1 77 组合2 77 组合优化 前言 1、回溯法解决的问题都可以抽象为树形结构(N叉树),使用树形结构来理解回溯。 2、回溯法解决的都是在集合中递归查找子集,集合的大小就构成了树的宽度,递归的深度&#xff…

FPGA基于GS2971/GS2972实现SDI视频收发 提供工程源码和技术支持

目录 1、前言2、我目前已有的SDI编解码方案3、GS2971/GS2972芯片解读GS2971解读GS2972解读 4、详细设计方案5、vivado工程1解读硬件逻辑工程软件SDK工程 6、vivado工程2解读硬件逻辑工程软件SDK工程 7、上板调试验证8、福利:工程代码的获取 1、前言 FPGA实现SDI视频…

多尺度深度特征(上):多尺度特征学习才是目标检测精髓(干货满满,建议收藏)...

计算机视觉研究院专栏 作者:Edison_G 深度特征学习方案将重点从具有细节的具体特征转移到具有语义信息的抽象特征。它通过构建多尺度深度特征学习网络 (MDFN) 不仅考虑单个对象和局部上下文,还考虑它们之间的关系。 公众号ID|ComputerVisionG…

零售行业公有云信息安全探讨

新钛云服已累计为您分享744篇技术干货 ⚠️公有云安全事件⚠️ 最近小半年接连处理了几起零售行业公有云安全事件,都是因为某种原因造成的数据泄露。有防护措施不当的,也有因为应用漏洞泄露被黑的,也有内部人员不慎造成的。 事后总结发现主要…

第一章 IRIS 基础知识:使用互操作性制作连接系统

文章目录 第一章 IRIS 基础知识:使用互操作性制作连接系统为什么要连接系统?介绍Productions 第一章 IRIS 基础知识:使用互操作性制作连接系统 本文介绍了如何将系统与 IRIS 数据平台互操作性产品连接在一起。 为什么要连接系统&#xff1f…

Golang每日一练(leetDay0063) 最大数、重复的DNA序列

目录 179. 最大数 Largest Number 🌟🌟 187. 重复的DNA序列 Repeated DNA Sequences 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏…

博客管理系统--博客列表页

准备工作设计数据库封装数据库操作创建实体类数据库增删查改操作(写法几乎很相似)前后端交互 准备工作 博客管理系统前端部分在学习前端、css、js部分实现;现在我们将完成后端工作;并且部署云服务上;使其能让所有联网的人使用。 …

【代码】一个LVQ神经网络的详解实例

本站原创文章,转载请说明来自《老饼讲解-BP神经网络》bp.bbbdata.com LVQ神经网络是用于样本分类的一个常用算法,本文先简单回顾LVQ神经网络是什么,然后展示如何用matlab工具箱来训练一个LVQ神经网络 目录 一. LVQ神经网络简介 1.1 LVQ神经…

“首次公开一年连升两级的晋升大法”!

见字如面,我是军哥! 今天把江湖上失传已久的技术人晋升大法分享给各位,据说当年雷jun总就是用了此法三年就干到了技术高管,请各位务必做好学习和分享动作。 说真的,用好这三个办法,就算在 IT 大厂一年都可以…

脑挫裂伤是什么?脑挫裂伤的4大症状要警惕!

脑挫裂伤是头部遭受暴力而引起的原发性脑器质性损伤。脑挫裂伤既可发生于着力点的脑组织,也可发生于对冲部位。脑挫裂伤病人的临床表现可以由于损伤部位,范围,程度的不同而有差异。受伤较轻的可以只有轻微的症状而受伤,较重的可以…

这玩意真的有用吗?对,是的!Kotlin 的 Nothing 详解

视频先行 下面是视频内容的脚本文案原稿分享。 文案原稿 Kotlin 的 Nothing 类,无法创建出任何实例: public class Nothing private constructor() 所以所有 Nothing 类型的变量或者函数,都找不到可用的值: val nothing: Nothing …

电脑视频录屏软件哪个好用 电脑视频录屏怎么录屏

录屏是我们的工作和生活中非常大的一个需求,尤其对于专业的视频制作者来说,经常需要录制屏幕和编辑视频,因此找到便捷好用的录屏软件非常重要。今天就来分享一下电脑视频录屏软件哪个好用,电脑视频录屏怎么录屏。 一、电脑视频录…

2023 年第八届数维杯大学生数学建模挑战赛 B 题 节能列车运行控制优化策略

在城市交通电气化进程快速推进的同时,与之相应的能耗增长和负面效应也 在迅速增加。城市轨道交通中的快速增长的能耗给城轨交通的可持续性发展带来 负担。2018 年,北京、上海、广州地铁负荷占全市总负荷的 1.5%-2.5%,成为了 城市电网的最大单体负荷[1]。…

软考A计划-真题-分类精讲汇总-第一章(计算机组成原理与体系结构)

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&am…

Java每日一练(20230512) 最大间距、串联子串、最长回文子串

目录 1. 最大间距 🌟🌟🌟 2. 串联所有单词的子串 🌟🌟🌟 3. 最长回文子串 🌟🌟 🌟 每日一练刷题专栏 🌟 Golang每日一练 专栏 Python每日一练 专栏 …

c++ 11标准模板(STL) std::vector<bool> (二)

定义于头文件 <vector> template<class Allocator> class vector<bool, Allocator>; std::vector<bool> 是 std::vector 对类型 bool 为空间提效的特化。 std::vector<bool> 中对空间提效的行为&#xff08;以及它是否有优化&#xff09;是实现…