WeakMap 弱引用 不会被GC所考量

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值。

例题1、

复制代码
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

例题2、来源自开发小知识分享 | 前端加油站🧠

这个男人还说vue3响应式系统为啥用WeakMap而不是Map,从下面代码的执行结果可知,Map存在着内存泄露,而WeakMap不存在内存泄露。性能优化点(源码中)

复制代码
const map = new Map();
const wMap = new WeakMap();
(() => {
  const foo = {
    foo: 1
  }
  const bar = {
    bar: 2
  }

  map.set(foo, 1)
  map.set(2, 1)
  wMap.set(bar, 1)
  // wMap.set(3, 1) // 报错,key必须是弱类型
  /**
   * WeakMap 是弱引用, 一旦表达式执行结束,垃圾回收就会把 bar 从内存中移除,所以无法从 weakMap中取到bar
   *  一旦被垃圾回收机制回收了,就无法获取到对应的 键和值了
   */
})()

console.log(map, map.keys(), map.size) // 依旧有办法获取 键和值
console.log(wMap, map.size) // 已经无法获取键和值了,因为是弱引用,已经被垃圾回收机制所回收了

前端中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环境中是可用的,但在部分老版本浏览器中不被支持,因此在使用时应注意兼容性。

相关推荐
燃烧的枫9 小时前
Windows 下 YOLO11 Pose 的 TensorRT C++ 部署
windows·yolo·tensorrt·1024程序员节·yolo11-pose
AI日报派送佬10 小时前
2026年11月02日 AI 行业日报|商汤开源 Loop-9B、Pika 发布 H3 Flex 音视频模型、Meta× 傅利叶推出人形机器人 Max
人工智能·微软·开源·音视频·openai·1024程序员节·ai日报
avi911110 小时前
【AI教人】UnityEditor扩展Spine动画,Spine骨骼,预览Preview一切
spine·骨骼动画·1024程序员节·editor扩展·spine动画·spine骨骼
开开心心就好11 小时前
网页图片批量下载工具,输入链接就保存
服务器·算法·leetcode·支持向量机·pdf·ocr·1024程序员节
Martina_03211 天前
AI生成的3D模型打印后沿层纹开裂?用6步检查方向、壁厚与填充
图像处理·人工智能·数学建模·3d·自然语言处理·游戏策划·1024程序员节
c_hn_0071 天前
量化数据12:国内期货L2历史数据:Tick、逐笔、五档盘口一次性打包下载
数据库·1024程序员节·#深度订单簿数据·#历史行情订单薄·#本地csv数据存储
释厄6231 天前
同性线套娃律——圆面积必然=1+2+...+n 的求和·圆心不与 π 相关
java·人工智能·算法·1024程序员节
在所不辞兄1 天前
【零基础学智能仿真-69】综合项目——材料参数驱动的仿真研究
人工智能·深度学习·神经网络·算法·机器学习·1024程序员节
Captain1314_李祖团1 天前
章节3:MLIR完成一个端到端的流程
mlir·1024程序员节
Solange__1 天前
在线3D预览器、Blender和游戏引擎怎么选?按5类任务比较格式、隐私与编辑性
人工智能·游戏·3d·游戏引擎·blender·1024程序员节·关卡设计