WeakMap 弱引用 不会被GC所考量

news2025/1/11 9:06:16

WeakMap是一种特殊的Map数据结构,只能以引用作为key,并且不会阻止其被垃圾回收。WeakMap的使用如下:

1. 创建WeakMap对象:


   const weakMap = new WeakMap();

2. 添加键值对:使用set()方法向WeakMap中添加键值对。注意这里的key为空对象


   const key = {}; // 引用类型作为key
   const value = 'value';
   weakMap.set(key, value);

3. 获取值:使用get()方法根据key获取对应的值。


   const value = weakMap.get(key);
   console.log(value); // 'value'

4. 判断是否存在key:使用has()方法判断key是否存在。


   const hasKey = weakMap.has(key);
   console.log(hasKey); // true

5. 删除键值对:使用delete()方法删除指定的键值对。


   const deleteResult = weakMap.delete(key);
   console.log(deleteResult); // true

        需要注意的是,由于WeakMap只能使用引用类型作为键,不能迭代和获取大小等操作。并且WeakMap的键是弱引用,一旦没有其他引用指向该key,它将会被垃圾回收掉。这也意味着无法遍历WeakMap中的键值对。

        WeakMap的应用场景包括:存储对象私有属性、缓存等。

Map和WeakMap对比

        如何体现他是个弱引用呢,看下下面的例题,当weakMap换成 new Map()时,输出变化的就只有size值

let key1 = { id: 1 };
let key2 = { id: 2 };
// 创建一个WeakMap对象
let weakMap = new WeakMap();
// let weakMap = new Map();
// 将键值对添加到WeakMap中
weakMap.set(key1, "Value 1");
weakMap.set(key2, "Value 2");
// 输出WeakMap的键值对数量
console.log(weakMap.has(key1),weakMap.has(key2),weakMap.get(key1),weakMap.get(key2), "Size of WeakMap: " + weakMap.size);  // 输出: Size of WeakMap: undefined
// 模拟删除key1对应的引用
key1 = null;
// 由于没有其他引用指向key1,它将被垃圾回收
// 此时WeakMap中只剩下key2对应的键值对
console.log(weakMap.has(key1),weakMap.has(key2),weakMap.get(key1),weakMap.get(key2),"Size of WeakMap after garbage collection: " + weakMap.size);  // 输出: Size of WeakMap: undefined

前端中WeakMap是一种新的数据结构,用于存储键值对,其中键是弱引用。以下是WeakMap的一些特点:

1. 弱引用:WeakMap中的键是弱引用,意味着如果没有其他引用指向该键,该键会被垃圾回收机制自动清除,从而释放内存。这意味着如果只有WeakMap中的键引用一个对象,而其他地方没有引用该对象,对象将被释放。

2. 键必须是对象:在WeakMap中,键必须是对象,而值可以是任何类型。这是因为WeakMap利用对象的引用作为键的唯一标识。

3. 无法迭代:WeakMap没有类似Map的keys()、values()和entries()方法,因为键是弱引用,无法准确迭代。

4. 无法获取大小:WeakMap没有size属性或者size()方法,也无法准确获取包含的键值对数量。

5. 用途:WeakMap常用于需要存储临时数据的场景,特别是在需要避免内存泄漏的情况下。另外,WeakMap也可以用于存储私有数据,因为外部代码无法直接访问WeakMap中的键。

需要注意的是,WeakMap在Node.js环境中是可用的,但在部分老版本浏览器中不被支持,因此在使用时应注意兼容性。

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

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

相关文章

c++ 模版的一些注意问题

声明和定义不可分离 举个例子&#xff1a; 定义一个Stack.h: 这里放声明 #include<iostream>using namespace std;template<class T> T Add(const T& left, const T& right);定义一个Stack.cpp, 这里面放定义: template<class T> T Add(const T&a…

虚拟机VMware Workstation Pro安装配置使用服务器系统ubuntu-22.04.3-live-server-amd64.iso

虚拟机里安装ubuntu-23.04-beta-desktop-amd64开启SSH(换源和备份)配置中文以及中文输入法等 ​一、获取Ubuntu服务器版 获取Ubuntu服务器版 二、配置虚拟机 选择Custom(advanced)&#xff1a; 选择Workstation 17.x: 选择“I will install the operating system later.”…

HashMap源码解析_jdk1.8(二)

HashMap源码解析_jdk1.8&#xff08;二&#xff09;构造函数put方法resize扩容方法 HashMap源码解析_jdk1.8&#xff08;二&#xff09; 构造函数 HashMap提供了如下几个构造函数&#xff1a; /*** 构造一个具有指定初始容量和负载因子的空HashMap.** param initialCapacit…

Android SystemUI setSystemUiVisibility()参数Flag详解

1&#xff1a;相关 Flag 特性详解 View.SYSTEM_UI_FLAG_LAYOUT_STABLE&#xff1a; 特性&#xff1a;默认状态下 &#xff0c;稳定页面显示布局。 当 StatusBar和 NavigationBar动态显示和隐藏时&#xff0c;系统为 fitSystemWindow“true”的view设置的padding大小都不会变化…

《机器学习实战》学习记录-ch4

4.1 线性回归 import numpy as np import matplotlib.pyplot as plt import pandas as pdX 2 * np.random.rand(100,1) # 生成 [0,1) 之间的数据 y 4 3 * X np.random.randn(100,1) # 生成一组正态分布的数据&#xff0c; 高斯噪声X_b np.c_[np.ones((100,1)), X] X_b[:5…

h265格式怎么转换mp4?一分钟教会你!

H265是一种视频编码标准&#xff0c;也被称为HEVC&#xff08;High Efficiency Video Coding&#xff09;。由联合视频组&#xff08;JVET&#xff09;开发的&#xff0c;是一种专为高清视频设计的压缩标准。播放H265文件&#xff0c;通常需要使用支持H265解码的播放器&#xf…

Docker 网络与Cgroup资源限制

目录 一、Docker 网络实现原理&#xff1a; 二、Docker 的网络模式&#xff1a; 三、网络模式详解&#xff1a; 1. host模式&#xff1a; 2. container模式&#xff1a; 3. none模式: 4&#xff0e;bridge模式: 5&#xff0e;自定义网络: 四、Cgroup资源控制&#xff1a; …

仿真调试stm32汇编代码

软件准备 ubuntu交叉编译链工具&#xff1a;arm-none-eabi-gcc, arm-none-eabi-as, arm-none-eabi-ldqemu仿真软件&#xff1a;支持stm32版本调试工具&#xff1a;gdb-multiarch 启动仿真实验 汇编代码 .thumb .syntax unified.equ STACKINIT, 0x20005000.section .text .o…

玩具玩偶经营小程序商城的作用是什么

对品牌商而言&#xff0c;传统的批发商模式&#xff0c;不利于品牌传播及构建自有私域流量池&#xff0c;无法与消费者面对面交流&#xff0c;一旦销售量不好&#xff0c;只能受限于下游的以销定产。无论销售商还是品牌商即使入驻第三方平台&#xff0c;也会面临佣金、广告位问…

开发习惯养成系列

1 开发习惯养成系列 2

【趣味Javascript】前端开发中不为人知的LHS和RHS查询,你真的弄明白了吗? 《1024程序员节特别篇》

&#x1f680; 个人主页 极客小俊 ✍&#x1f3fb; 作者简介&#xff1a;web开发者、设计师、技术分享博主 &#x1f40b; 希望大家多多支持一下, 我们一起进步&#xff01;&#x1f604; &#x1f3c5; 如果文章对你有帮助的话&#xff0c;欢迎评论 &#x1f4ac;点赞&#x1…

你知道AI数字人可以用在哪些行业吗?

引言&#xff1a; 随着科技的不断进步&#xff0c;人工智能&#xff08;AI&#xff09;已经渗透到各个领域&#xff0c;其中包括宣传营销。AI数字人是宣传营销领域的一项革命性技术&#xff0c;它们为企业提供了全新的机会&#xff0c;从客户互动到市场分析&#xff0c;再到销…

jenkins实践篇(1)——基于分支的自动发布

问题背景 想起初来公司时&#xff0c;我们还是在发布机上直接执行发布脚本来运行和部署服务&#xff0c;并且正式环境和测试环境的脚本都在一起&#xff0c;直接手动操作脚本时存在比较大的风险就是将环境部署错误&#xff0c;并且当时脚本部署逻辑还没有检测机制&#xff0c;…

初学编程入门基础教学视频,初学编程学什么语言

学习编程捷径&#xff1a;&#xff08;不论是正在学习编程的大学生&#xff0c;还是IT人士或者是编程爱好者&#xff0c;在学习编程的过程中用正确的学习方法可以达到事半功倍的效果。对于初学者&#xff0c;可以通过下面的方法学习编程&#xff0c;通过对成百上千个实例练习&a…

ilr normalize isometric log-ratio transformation

visium_heart/st_snRNAseq/05_colocalization/create_niches_ct.R at 5b30c7e497e06688a8448afd8d069d2fa70ebcd2 saezlab/visium_heart (github.com) 更多内容&#xff0c;关注微信&#xff1a;生信小博士 The ILR (Isometric Log-Ratio) transformation is used in the anal…

Spring Boot集成RESTful API

在Spring Boot中集成一个RESTful API是我们在实际开发中较为常见的一种开发任务&#xff0c;以下通过一个小的案例来展示在Spring Boot中创建RESTful API来编写一个单元测试。 本节使用到的注解&#xff1a; Controller&#xff1a;修饰class&#xff0c;用来创建处理http请求的…

让锅碗瓢盆变成我们生活的快乐插曲

&#x1f31f;现代生活中&#xff0c;厨房不再只是一个独立的烹饪区域&#xff0c;而是成为了家庭生活的核心。开放式厨房的设计概念已经成为越来越多家庭的选择&#xff0c;它不仅为我们带来了便利和舒适&#xff0c;还创造了一种与家人和朋友共享美食的愉悦体验。让我们一起探…

线程池常见面试题总结

线程池的工作原理和实现已经在之前的文章中介绍 本文主要总结面试中线程池常问题目。 1、有几种常见的线程池&#xff08;必知必会&#xff09;? 1&#xff09;定长线程池&#xff08;FixedThreadPool&#xff09; 2&#xff09;定时线程池&#xff08;ScheduledThreadPoo…

25.2 MySQL 运算符

1. 伪表 在MySQL中, DUAL是一个特殊的单行, 单列的虚拟表, 主要用于在SELECT语句中计算表达式或执行函数, 而不需要从实际的数据表中检索数据. 使用DUAL的原因主要有以下几点:* 1. 简化计算: 通过在SELECT语句中使用DUAL, 可以方便地计算表达式或执行函数, 而无需创建临时表或…

android点击全屏预览照片第三方库使用

android点击全屏预览照片第三方库使用-imgepreviewlibrary 移动端我们经常会遇到放大预览照片&#xff0c;如果是一张照片&#xff0c;那就全屏展示图片就好了&#xff0c;但是如果是一个列表&#xff0c;滑动查看&#xff0c;我们一般会借助viewpager进行实现&#xff0c;但是…