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

相关推荐
fangzhanpeng1684 小时前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心2 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u0103055278 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055279 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝10 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u01030552710 天前
Java图像处理实战指南
人工智能·1024程序员节
u01030552711 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u01030552713 天前
Java实用类应用精讲
人工智能·1024程序员节
u01030552713 天前
Java I/O核心操作实战
人工智能·1024程序员节
u01030552714 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节