ES6中的Map和WeakMap你能分清吗?这里教会你

news2024/9/20 5:44:20

Map和WeakMap都是ES6中新增的数据结构,用于存储键值对。他们之间有什么区别,本文给大家详细讲述下,并附上示例代码。

一、什么是Map和WeakMap?

在JavaScript中,Map和WeakMap都是用来存储键值对的数据结构。

Map是一种普通的键值对集合,可以使用任意类型的值作为键,并且可以迭代遍历其中的元素。Map中的键是强引用,即使键没有被其他对象引用,Map中的键值对也不会被回收。

WeakMap是一种特殊的键值对集合,其中的键必须是对象,而不能是基本类型的值。WeakMap中的键是弱引用,如果键没有被其他对象引用,那么键值对会被垃圾回收机制回收。WeakMap没有提供直接的遍历方法,也没有迭代器,因此无法直接遍历所有的键值对。

总的来说,Map适合存储需要长期保存键值对的情况,而WeakMap适合存储临时的键值对,并且不需要长期保存键值对的情况。

二、Map和WeakMap的区别

Map和WeakMap都是ES6中新增的数据结构,用于存储键值对。它们之间的主要区别在于对键的引用的处理方式。

1. 引用处理方式:

  • - Map:Map中的键是强引用,即使键没有被其他对象引用,Map中的键值对也不会被回收。
  • - WeakMap:WeakMap中的键是弱引用,如果键没有被其他对象引用,那么键值对会被垃圾回收机制回收。

2. 键的类型:

  • - Map:Map的键可以是任意类型的值,包括基本类型和对象。
  • - WeakMap:WeakMap的键必须是对象,而不能是基本类型的值。

3. 遍历方式:

  • - Map:Map可以通过forEach()方法或迭代器进行遍历。
  • - WeakMap:WeakMap没有提供直接的遍历方法,也没有迭代器,因此无法直接遍历所有的键值对。

Map适合存储键值对,并且需要长期保存键值对的情况,而WeakMap适合存储临时的键值对,并且不需要长期保存键值对的情况。

三、示例代码

当使用Map时,我们可以这样创建一个Map并操作它:

// 创建一个Map
let myMap = new Map();

// 添加键值对
let key1 = "key1";
let value1 = "value1";
myMap.set(key1, value1);

// 获取值
console.log(myMap.get(key1)); // 输出: value1

// 使用迭代器遍历
for (let [key, value] of myMap) {
  console.log(key + " = " + value);
}

当使用WeakMap时,我们可以这样创建一个WeakMap并操作它:

// 创建一个WeakMap
let myWeakMap = new WeakMap();

// 创建一个对象作为键
let keyObj = {};
let value2 = "value2";

// 添加键值对
myWeakMap.set(keyObj, value2);

// 获取值
console.log(myWeakMap.get(keyObj)); // 输出: value2

需要注意的是,由于WeakMap的键必须是对象,因此不能像Map那样直接使用基本类型的值作为键。

大千UI工场→10年UI设计老和前端开发老司机,持续为大家分享有价值、有见地的观点、作品、干货,欢迎评论、关注、点赞、有事您私信。

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

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

相关文章

vue.js对接海康威视摄像头web开发包

一、登录海康开放平台下载web开发包,下载需要先登录海康账号,没有的需先注册一个。 这里的appkey、ip、port、secret 和cameraIndexCodeasd是自己去申请的 appkey: "****", ip: "****", port: **, secret: "****", //必填…

区块链钱包如果丢失了私钥或助记词,资产还能恢复吗?

如果你丢失了区块链钱包的私钥或助记词(通常是用于恢复钱包的短语或种子),那么你的资产在大多数情况下是无法恢复的。私钥是访问和控制你在区块链上资产的唯一凭证,而助记词(如BIP39标准中的12、18、24个单词的短语&am…

科技产业园3D探秘:未来科技之城的奇幻之旅

在数字时代的浪潮中,科技产业园区成为了推动城市经济发展、科技创新的重要引擎。 当我们打开科技产业园的3D可视化模型,仿佛穿越时空,来到了一个充满奇幻色彩的科技世界。在这里,高楼大厦鳞次栉比,绿色植被点缀其间&am…

1673. 找出最具竞争力的子序列

题目 给定一个整数数组 nums 和一个正整数 k,返回长度为 k 且最具竞争力的 nums 子序列。 数组的子序列是从数组中删除一些元素(可能不删除元素)得到的序列。 在子序列 a 和子序列 b 第一个不相同的位置上,如果 a 中的数字小于…

【C语言】结构体内存对齐:热门面试话题

🔥引言 书接上文,我们了解关于结构体的基本知识,这篇将深入剖析结构体中一个重要的知识点:内存对齐 关于内存对齐是属于热门面试话题,对此单独放在一篇来分享 🌈个人主页:是店小二呀 🌈C语言笔记…

uniapp宠物咖门店连锁会员制宠物寄养系统 微信小程序-

随着人们生活水平的提高,越来越多的人喜欢给自己或是家里的老人小孩养一只可爱的宠物,满足宠物的需要也就成为了许多爱宠人士每天苦恼的事情,去哪可以选购到健康合格的宠物食品?去哪能给宠物看病?去哪能给脏了的宠物美…

Nat Hum Behav | 人类前额叶皮层非空间注意力的因果相位依赖性控制

摘要 非空间注意力是一种基本的认知机制,它使个体能够将意识的焦点从无关刺激转向与行为目标相关的感觉信息上。有人提出了一种关于注意力是由前额叶皮层中缓慢兴奋性波动的持续相位所调节的假设,但这一假设存在争议且尚未达成共识。在这里,…

Rust Tarui 中的 Scrcpy 客户端,旨在提供控制安卓设备的鼠标和按键映射,类似于游戏模拟器。

Scrcpy-mask 为了实现电脑控制安卓设备,本人使用 Tarui Vue 3 Rust 开发了一款跨平台桌面客户端。该客户端能够提供可视化的鼠标和键盘按键映射配置。通过按键映射实现了实现类似安卓模拟器的多点触控操作,具有毫秒级响应速度。该工具可广泛用于电脑控…

亚信安慧AntDB数据库采集技术创新:ACC从Java到Go的转型之路

传统的指标采集方法通常使用一些命令行工具,如top、free等来获取系统的性能数据。然而,这种方法存在一些缺点。首先,这些命令行工具输出的数据格式通常是文本形式,需要进行解析和处理才能得到有用的信息,这增加了开发者…

【深度学习】加速采样生成图像——DDIM原理解析

文章目录 1、前言2、DDPM回顾及为何不能跳步采样2.1、回顾2.2、从DDPM的目标函数视角上看,为什么无法跳步采样?2.3、DDPM的困境 3、DDIM3.1、马尔可夫假设3.2、跳步采样构造3.3、DDIM的目标函数3.4、求解目标函数3.4.1、设定逆扩散过程3.4.2、求解KL散度…

企业级内网穿透(神卓互联)

神卓互联内网穿透采用自主研发的 WanGooe Tunnel 第九代核心引擎,拥有高级别用户访问权限验证,无授权将无法访问项目,地域限制,可灵活设置仅限某个地区可以访问 项目,保障数据传输安全采用,端到端加密&…

【cocos creator】进度条控制脚本,支持节点进度条,图片进度条,进度条组件,和进度文字展示

进度条控制脚本,支持节点进度条,图片进度条,进度条组件,和进度文字展示 const { ccclass, property, menu } cc._decorator;let text_type cc.Enum({"20%": 0,"1/5": 1,"差值": 2,"自定义…

Windows:iHasher-v0.2安装报错Windows 功能 .NET Framework 3.5

一、情景描述 我们从MSDN下载了镜像文件,一般要验证下载文件的HASH值是否与MSDN上发布的一致,确保传出过程中iso文件没有损坏。 MSDN地址:https://msdn.itellyou.cn/ 我从MSDN下载了Hasher工具,进行校验。 但是,安装…

js 面试题学习笔记一

1、什么是防抖和节流?有什么区别?如何实现? 防抖:触发高频事件后N秒内函数只会执行一次,如果N秒高频事件再次被触发,则重新计算时间。(a时间触发,5秒内执行一次,但是第4…

【代码随想录】【算法训练营】【第16天】 [104]二叉树的最大深度 [111]二叉树的最小深度 [222]完全二叉树的节点个数

前言 思路及算法思维,指路 代码随想录。 题目来自 LeetCode。 day 16,周四,再坚持一下吧~ 题目详情 [104] 二叉树的最大深度 题目描述 104 二叉树的最大深度 解题思路 前提:二叉树的最大深度,等价于二叉树的层…

C#读取.sql文件并执行文件中的sql脚本

有些时候我们需要在程序中编写读取sql脚本文件并执行这些sql语句,但是我们在有些时候会遇到读出来的sql语句不能执行,其实不能执行并不是你的sql脚本文件有错误,而是去执行sql语句的时候,C#代码里面执行sql语句的代码对sql里面的一…

新书推荐:6.2 else if语句

本节必须掌握的知识点: 示例代码二十 代码分析 汇编解析 ■if语句表达形式3 if(表达式1) statement1 else if(表达式2) statement2 else if(表达式3) statement3 …… else statementN 解析: 如果表达式1非0,则执行statement1&#…

基于Netty实现WebSocket服务端

本文基于Netty实现WebSocket服务端,实现和客户端的交互通信,客户端基于JavaScript实现。 在【WebSocket简介-CSDN博客】中,我们知道WebSocket是基于Http协议的升级,而Netty提供了Http和WebSocket Frame的编解码器和Handler&#…

9.3 Go语言入门(变量声明和函数调用)

Go语言入门(变量声明和函数调用) 目录二、变量声明和函数调用1. 变量声明1.1 使用 var 关键字声明1.2 简短声明1.3 零值1.4 常量 2. 函数调用2.1 函数定义2.2 多个返回值2.3 命名返回值2.4 可变参数2.5 匿名函数和闭包 目录 Go 语言(Golang&a…

Windows11下使用Qt5.14.2编译QtXlsx驱动详细步骤

原有&#xff1a;由于系统需要将QTableWidget表格中的数据导出、在Windows下最开始使用Excel.Application组件实现了导出功能&#xff0c;后面将代码转换到Ubuntu20.04下进行编译&#xff0c;发现项目.pro文件中的QT axcontainer和代码.h文件中的#include <QAxObject>跟…