• WeakMap 弱引用 不会被GC所考量


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

    1. 创建WeakMap对象:

    1. const weakMap = new WeakMap();

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

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

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

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

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

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

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

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

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

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

    Map和WeakMap对比

    例题1、

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

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

    在node环境下

    1. const map = new Map();
    2. const wMap = new WeakMap();
    3. (() => {
    4. const foo = {
    5. foo: 1
    6. }
    7. const bar = {
    8. bar: 2
    9. }
    10. map.set(foo, 1)
    11. map.set(2, 1)
    12. wMap.set(bar, 1)
    13. // wMap.set(3, 1) // 报错,key必须是弱类型
    14. /**
    15. * WeakMap 是弱引用, 一旦表达式执行结束,垃圾回收就会把 bar 从内存中移除,所以无法从 weakMap中取到bar
    16. * 一旦被垃圾回收机制回收了,就无法获取到对应的 键和值了
    17. */
    18. })()
    19. console.log(map, map.keys(), map.size) // 依旧有办法获取 键和值
    20. console.log(wMap) // 已经无法获取键和值了,因为是弱引用,已经被垃圾回收机制所回收了

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

  • 相关阅读:
    从零开始的Docker Desktop使用,Docker快速上手 ( ̄︶ ̄)↗ Docker介绍和基础使用
    FlexRay网络管理与测试
    自动化框架参数间传递的一种最佳实践
    【Redis 进阶】Redis 典型应用 —— 缓存(cache)
    三、C#—变量,表达式,运算符(3)
    Docker | 容器互联互通
    记一次edu站点并拿下的过程cnvd
    仅用61行代码,你也能从零训练大模型
    Skywalking Docker单机环境搭建
    关于agi中的Function Calling深入解析
  • 原文地址:https://blog.csdn.net/m0_47999208/article/details/134015410