当前位置: 首页 > news >正文

JS中的WeakMap

WeakMap

weakmap是一种类似map的类型,但它的key是弱引用,并且key只能是对象。

weakmap和map的区别

  1. weakmap的key只能是对象,value可以是任何值
const weakMap = new WeakMap(); // 创建WeakMap实例

const key1 = "key1";  // 字符串键
const key2 = 123;     // 数字键
const key3 = { name: "John" }; // 对象键

// 尝试用非对象键会抛出TypeError
weakMap.set(key1, "value1"); // TypeError: Invalid value
weakMap.set(key2, "value2"); // TypeError: Invalid value

// 合法操作:使用对象作为键
weakMap.set(key3, "value3");
console.log(weakMap.get(key3)); // 输出:"value3"
  1. weakmap中的key是弱引用,不会阻止与之关联的对象被垃圾回收。而map的key是强引用。 (也就是说weakmap中对key对象的引用不会被计入到“引用计数法”垃圾清除机制的计数中)
let weakMap = new WeakMap();  
let key1 = { name: "John" };  

key1 = null;                  // 解除对象引用

// WeakMap键必须保持对象引用
weakMap.set(key1, "value1");  // 此时key1=null会报错,因为key1已经被回收

上述代码中,本来{name:“John”}对象有2个引用(key1和weakmap),但由于weakmap是弱引用,所以不计入标记清除法的计数过程中。所以一旦将key1释放,xdy已经没有任何元素引用{name:“John”}对象了。weakmap中对应的key也就随之释放。
如果换成map,那么只要map存在,{name:“John”}对象的引用数就至少为1,永远不会被释放。
3. weakmap不能通过forEach或map.keys()来遍历其中的所有key

weakmap的应用场景

  1. 引用DOM元素
    比如记录点击按钮的次数,将weakmap的key设置为btn(指向按钮dom元素的地址),value设置为count(点击的次数)。
    为什么用map不行?
    如果用map,那么有朝一日我们不需要统计按钮点击次数了,就会将btn指向null。但此时这个按钮的对象并不会被移除,因为map的key依然指向它,只要map存在,它就不会被移除,那么就造成了内存泄漏!
  2. 做缓存
    同样的道理,不用map是因为如果有一天我们不需要对某个数据进行缓存了,我们希望在weakmap中存储的键值对也随着垃圾清除机制被清除。

相关文章:

  • 思考 - 操作系统
  • 路由器工作在OSI模型的哪一层?
  • babel-runtime 如何缩小打包体积
  • usbip学习记录
  • 基于springboot微信小程序课堂签到及提问系统(源码+lw+部署文档+讲解),源码可白嫖!
  • 自动提取pdf公式 ➕ 输出 LaTeX
  • C++ 指针类型转换全面解析与最佳实践
  • PyTorch标注工具
  • 【C++】Chapter04<STL部分>:STL标准模板库概要
  • 【团体程序涉及天梯赛】L1~L2实战反思合集(C++)
  • Java并发编程高频面试题
  • Dubbo(41)如何排查Dubbo的服务不可用问题?
  • OpenCV阈值处理详解
  • 企业数据分析何时该放弃Excel?
  • No module named ‘keras.engine‘
  • mysql8.0.29 win64下载
  • SpringCloud的简单介绍
  • Jmeter脚本使用要点记录
  • volatile关键字用途说明
  • 打印网络内的层名称与特征图大小
  • 住建部:推进“好房子、好小区、好社区、好城区”四好建设
  • 商务部:对原产于美国、欧盟、台湾地区和日本的进口共聚聚甲醛征收反倾销税
  • 哪条线路客流最大?哪个站点早高峰人最多?上海地铁一季度客流报告出炉
  • 用贝多芬八首钢琴三重奏纪念风雨并肩20年
  • 年在沪纳税350亿人民币,这些全球头部企业表示“对上海承诺不会变”
  • 广西北部湾国际港务集团副总经理潘料庭接受审查调查