js语法---weakMap和weakSet:弱映射和弱集合

news2024/10/23 20:19:25

weakMap

weakMap是Map的一种,但它有更多的限制,

1. WeakMap 和 Map 的第一个不同点就是,WeakMap 的键必须是对象,不能是原始值(number,string,symbol...)

2. WeakMap 不支持迭代以及 keys()values() 和 entries() 方法。所以没有办法获取 WeakMap 的所有键或值这也表示无法直接获取到weakMap的内部值(打印),

  1. 不可被打印出内容
  2. 不能获取键值
  3. 无法迭代遍历

WeakMap 只有以下的方法:

  • weakMap.get(key) 读取一个值
  • weakMap.set(key, value) 设置一个键值
  • weakMap.delete(key) 删除一个键值
  • weakMap.has(key) 查询键是否存在

        以上这些性质,说明了weakMap可以设置键值,但键必须是对象;不暴露键,没有预知键,就无法拿到对应的值;对weakMap的操作都是基于键,没有键就无法操作weakMap,这相等于拥有很高的保密性;

新建一个weakMap

// 新建一个弱映射
const wMap = new WeakMap();
// 新建一个对象作为弱映射的键
const obj = {
  name: 'John'
};

// obj作为弱映射的键
wMap.set(obj, '这是一个weakMap');

console.log(wMap);
console.log(wMap.get(obj));// 这是一个weakMap

可以看到通过get方法拿到了obj对应的值,而直接打印则没有结果

‘weak’的特性

除了表面用法上的隐私性存值,weakMap还有一个重要的特性,

在JavaScript 引擎中,值在“可达”和可能被使用时,会保持在内存中,否则会被清除;

而对于weakMap,当这个对象存入了weakMap键中,被置空后该对象将会被从内存(和weakMap)中自动清除(节约内存)。

         这个过程就相当于,在一个硬盘中,如果一个文件夹是空文件夹,在不节约空间的情况下(map的环境),空文件夹会被保留,而在节约空间的情况下(weakMap的环境),空文件夹被认为没有作用,被删除。

        这种节省的能力一般会用在第三方库的引用,第三方库常常比较消耗内存,大多数情况下都是使用其一小部分功能,当一个第三方库被使用完后,删除引用它的对象(键),这个第三方库的其他内容也就无法访问到而被删除了

weakSet

和set一样,weakSet也是不重复的值的集合,但是它的值被限制为只能是对象,

  • 与 Set 类似,但是我们只能向 WeakSet 添加对象(而不能是原始值)。
  • 对象只有在其它某个(些)地方能被访问的时候,才能留在 WeakSet 中。
  • 跟 Set 一样,WeakSet 支持 addhas 和 delete 方法,但不支持 size 和 keys(),并且不可迭代。
  1. 只能存对象
  2. 对象没有被使用时,最后会weakSet被删除
  3. 不能被读取值,也不能遍历,只能对其添加,删除和判断

 以上这些性质表示,weakSet可以存值,但不可读取值,只能判断是否有这个值,和删除一个值,

新建一个weakSet

// 新建一个弱集合
const wSet = new WeakSet();
// 新建对象作为弱集合的值
const user1={
  name :'张三'
}
const user2={
  name :'李四'
}
const user3={
  name :'王五'
}
// 将user1,user2作为弱集合的值
wSet.add(user1);
wSet.add(user2);

wSet.has(user1);// true
wSet.has(user3);// false

用户1进入过wSet,可以得到true的判定,用户3则没有被wSet添加,返回了false,

这个特性可以用来表示用户是否访问了网站

一个复杂点的数据结构

// 新建一个弱映射
const wMap = new WeakMap();
// 新建一个映射
const map = new Map();
// 新建一个集合
const set = new Set();
// 新建一个对象作为弱映射的键,同时内容作为映射的值
const obj = {
  name: 'John'
};


set.add(obj);
// 将obj对象的name作为map映射name键的值
map.set(obj.name,set);
// 在将map映射作为wMap映射obj对象的值
wMap.set(obj, map);

console.log('key:\t',obj,'\nvalue:\t',wMap.get(obj));

 

这是一个三层结构,当obj被清除时,后面的map和set都无法被访问了(都被清除),

总结

WeakMap 是类似于 Map 的集合,它仅允许对象作为键,并且一旦通过其他方式无法访问这些对象,垃圾回收便会将这些对象与其关联值一同删除。

WeakSet 是类似于 Set 的集合,它仅存储对象,并且一旦通过其他方式无法访问这些对象,垃圾回收便会将这些对象删除。

它们的主要优点是它们对对象是弱引用,所以被它们引用的对象很容易地被垃圾收集器移除

完整代码展示


// 新建一个弱映射
const wMap = new WeakMap();
// 新建一个对象作为弱映射的键
const obj = {
  name: 'John'
};

// obj作为弱映射的键
wMap.set(obj, '这是一个weakMap');

console.log(wMap);
console.log(wMap.get(obj));// 这是一个weakMap

// 新建一个弱集合
const wSet = new WeakSet();
// 新建对象作为弱集合的值
const user1={
  name :'张三'
}
const user2={
  name :'李四'
}
const user3={
  name :'王五'
}
// 将user1,user2作为弱集合的值
wSet.add(user1);
wSet.add(user2);

console.log(wSet.has(user1));// true
console.log(wSet.has(user3));// false
console.log(wSet);




// // 新建一个弱映射
// const wMap = new WeakMap();
// // 新建一个映射
// const map = new Map();
// // 新建一个集合
// const set = new Set();
// // 新建一个对象作为弱映射的键,同时内容作为映射的值
// const obj = {
//   name: 'John'
// };


// set.add(obj);
// // 将obj对象的name作为map映射name键的值
// map.set(obj.name,set);
// // 在将map映射作为wMap映射obj对象的值
// wMap.set(obj, map);

// console.log('key:\t',obj,'\nvalue:\t',wMap.get(obj));

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

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

相关文章

JavaScript的学习之旅(6.20)

目录 一、认识三个常见的js代码 二、js写入的第二种方式 三、js里内外部文件 一、认识三个常见的js代码 <script>//写入js位置的第一个地方// 控制浏览器弹出一个警告框alert("这是一个警告");// 在计算机页面输入一个内容&#xff08;写入body中&#xff…

力扣SQL50 至少有5名直接下属的经理 子查询 join 虚拟表

Problem: 570. 至少有5名直接下属的经理 &#x1f468;‍&#x1f3eb; 参考题解 &#x1f37b;子查询 select name from Employee where id in(select managerId from Employee group by managerId having managerId ! null and count(*) > 5);&#x1f37b; join 虚拟…

力扣SQL50 有趣的电影 简单查询

Problem: 620. 有趣的电影 Code select * from cinema where id % 2 1 and description ! boring order by rating desc;

【云岚到家】-day04-1-数据同步方案-Canal-MQ

【云岚到家】-day04-1-数据同步方案-Canal-MQ 1 服务搜索1.1 服务搜索技术方案1.1.1 需求分析1.1.2 技术方案1.1.2.1 使用Elasticsearch进行全文检索1.1.2.2 索引同步方案 1.1.3 CanalMQ1.1.3.1 MySQL主从数据同步1.1.3.2 Canal工作流程1.1.3.3 具体实现方案 1.2 MQ技术方案1.2…

conda创建虚拟环境报错解决

1.报错截图 2.解决办法 查看当前所有虚拟环境 conda env list 解决办法 解决方法 bash conda config --add channels conda-forge conda config --set channel_priority strict conda config --set channel_priority flexible

Java文件/文件夹的新增/删除/递归遍历

获取File对象 这里的字符串可以乱写&#xff0c;但是如果不存在后续的操作也会失败 // 获取抽象的File对象&#xff08;文件或者目录&#xff0c;不一定真实存在&#xff09;File file1 new File("D:\\2_WorkSpace\\qcbyProject\\shixun\\collection-test\\src\\FileTes…

B站广告开户投流是什么政策?要哪些资质?

B站&#xff08;哔哩哔哩&#xff09;作为年轻人喜爱的视频分享社区&#xff0c;其广告价值也日益凸显。为了更好地服务广告主&#xff0c;B站近日对广告开户投流政策进行了更新&#xff0c;云衔科技作为专业的数字营销服务商&#xff0c;也积极响应&#xff0c;为广告主提供一…

【项目实践】Ulike充电牙刷拆解

前言 用了一段时间的充电牙刷&#xff0c;某一次突然没电了&#xff0c;按键也没有反应。无奈只能废弃。最近略微得了些空闲&#xff0c;想着把它拆解看看里面的结构和电路。以下是鼓捣过程记录。 为什么不能直接抽出来&#xff1f; 在网上看到很多拆解视频&#xff0c;都是打开…

CSS--解决图片变形的方法

原文网址&#xff1a;CSS--解决图片变形的方法_IT利刃出鞘的博客-CSDN博客 简介 本文介绍html文件中图片变形的解决方法。 问题描述 我们经常需要指定所有图片的大小&#xff0c;让它们排列起来时看起来更整齐。但是&#xff0c;如果我们指定了width和height&#xff0c;那…

实践分享|关于 nebula-stats-exporter 的使用

大家好&#xff0c;这里是玖叁叁&#xff0c;目前从事全栈工程师工作&#xff0c;刚刚接触 NebulaGraph 不久&#xff0c;还在努力学习当中。图数据库可以高效地表达、存储和分析复杂关系和网络&#xff0c;在特定场景下有着不错的性能。希望通过这篇 nebula-stats-exporter 的…

Tesseract-OCR 5.0LSTM训练

准备工作 1.安装tesseract5.0版本 2.配置tesserac环境变量 3.jTessBoxEditor(需要java环境) 很多博客已有详细教程&#xff0c;不再赘述&#xff0c;本文以训练为主 最终文件目录: --tif 需要训练的tif文件 --lstmf 后文会讲到生成的方式 --txt 后文会讲到生成的方式 --box 后文…

JavaScript:at()方法遇到的问题并解决

目录 第一章 前言 第二章 使用at方法 第三章 分析原因并解决问题 第一章 前言 最近上线了一个项目&#xff0c;测试过程中并没有什么问题&#xff0c;但是上线后使用的用户多了&#xff0c;结果出现了这么一个问题&#xff1a;.at方法对低版本手机的浏览器不兼容问题&#x…

C++的动态内存分配

使用new/delete操作符在堆中分配/释放内存//使用new操作符在堆中分配内存int* p1 = new int;*p1 = 2234;qDebug() << "数字是:" << *p1;//使用delete操作符在堆中释放内存delete p1;在分配内存的同时初始化//在分配内存的时初始化int* p2 = new int(100…

windows和linux下清空Redis

前言 在本文中&#xff0c;我们将详尽阐述在Windows与Linux操作系统中有效清除Redis缓存的实践方法&#xff0c;旨在为您提供清晰、高效的指导流程&#xff0c;确保数据管理的灵活性与效率。 windows下推荐两款可视化工具 Another Redis Desktop Manager 这是我用的最多也是最…

【iOS】#include、#import、@class、@import

文章目录 #include#importclassimport总结 #include #include是c\c中的预处理器指令&#xff0c;用于包含头文件的内容 但是使用#include可能会出现重复包含文件的问题&#xff0c;因此需要使用&#xff08;#ifndef/#define/#endif&#xff09;。 #import //导入系统头文件…

Linux-目录和文件

目录 一、Linux目录 1、Linux常见目录 2、常见的Linux文件类型 二、cat-查看文件命令 1、cat命令用法 三、分页查看文件内容 1、 more命令 ​2、less命令 ​3、more和less的区别 四、查看文件开头或末尾 1、head命令 2、tail命令 3、wc-统计文件内容 4、grep 命令…

NLP基础概念

NLP任务不同于CV任务&#xff0c;它存在更多难点&#xff0c;例如&#xff1a; 数据表示&#xff1a;NLP任务处理的是文本数据&#xff0c;需要将自然语言文本转化为计算机可处理的形式&#xff0c;即如何把字符串变为数值数据&#xff0c;常用的有词嵌入&#xff08;Word Embe…

20240621 每日AI必读资讯

&#x1f916;GPT-4 通过图灵测试&#xff01;&#xff01; 研究人员称人们在图灵测试中无法区分 GPT-4 和人类&#xff0c;圣地亚哥加州大学认知科学系的研究人员针对GPT 4复刻了图灵测试。 研究人员招募了500名参与者&#xff0c;与四个代理人&#xff1a;人类、1960年代的…

英伟达和IBM搞事情!主攻“量子计算+AI”

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 文丨娴睿/慕一 排版丨沛贤 深度好文&#xff1a;2000字丨8分钟阅读 Ismael Faro是一位计算机工程师&#xff0c;自2015年以来&#xff0c;他就成为开发IBM量子软件生态系统的重要人物。从2016…

Debugger的使用

断点调试 1.打断点 2.以debug模式运行 3.流程控制