es6通过weakmap解决内存泄漏问题(代码片段)

Mazey Mazey     2022-10-24     697

关键词:

一、Map

1.定义

Map对象保存键值对,类似于数据结构字典;与传统上的对象只能用字符串当键不同,Map对象可以使用任意值当键。

2.语法

new Map([iterable])

属性

  • size:返回键值对的数量。

操作方法

  • set(key, value):设置(新增/更新)键key的值为value,返回Map对象。
  • get(key):读取键key的值,没有则返回undefined。
  • has(key):判断一个Map对象中是否存在某个键值对,返回true/false。
  • delete(key):删除某个键值对,返回true/false。
  • clear():清除Map对象中所有键值对。

遍历方法

  • keys():返回键名的Iterator对象。
  • values():返回键值的Iterator对象。
  • entries():返回键值对的Iterator对象。
  • forEach((value, key, map) => ):遍历Map对象所有键值对。

3.示例

操作方法

let m = new Map([
    ['foo', 11],
    ['bar', 22]
]);
m.set('mazey', 322)
    .set('mazey', 413);
console.log(m); // "foo" => 11, "bar" => 22, "mazey" => 413
console.log(m.has('mazey')); // true
m.delete('mazey');
console.log(m.has('mazey')); // false
m.clear();
console.log(m); // 

遍历方法

let m = new Map([
    ['foo', 11],
    ['bar', 22],
    ['mazey', 413]
]);
console.log(m); // "foo" => 11, "bar" => 22, "mazey" => 413
console.log(m.keys()); // MapIterator "foo", "bar", "mazey"
console.log(m.values()); // MapIterator 11, 22, 413
console.log(m.entries()); // MapIterator "foo" => 11, "bar" => 22, "mazey" => 413
m.forEach((value, key, map) => 
    console.log("键:%s,值:%s", key, value);
);
// 键:foo,值:11
// 键:bar,值:22
// 键:mazey,值:413

二、WeakMap

1.定义

WeakMap对象保存键值对,与Map不同的是其键必须是对象,因为键是弱引用,在键对象消失后自动释放内存。

2.语法

new WeakMap([iterable])

方法

  • set(key, value):设置(新增/更新)键key的值为value,返回WeakMap对象。
  • get(key):读取键key的值,没有则返回undefined。
  • has(key):判断一个WeakMap对象中是否存在某个键值对,返回true/false。
  • delete(key):删除某个键值对,返回true/false。
注意

因为WeakMap的特殊的垃圾回收机制,所以没有clear()方法。

3.示例

let obj = 
    foo: 11
;
let wm = new WeakMap();
wm.set(obj, 413322);
console.log(wm); // … => 413322
console.log(wm.has(obj)); // true

三、通过WeakMap解决内存泄漏问题

当使用Dom对象绑定事件时,Dom对象消失后若没有及时释放内存(置null),便会一直存在内存中。
使用WeakMap保存Dom对象不会出现这样的问题,因为Dom对象消失后,JS的垃圾回收机制便会自动释放其所占用的内存。

<button type="button" id="btn">按钮</button>
<script>
let wm = new WeakMap();
let btn = document.querySelector('#btn');
wm.set(btn, count: 0);
btn.addEventListener('click', () => 
    let v = wm.get(btn);
    v.count++;
    console.log(wm.get(btn).count);
);
// 1 2 3 4 5...
</script>

android架构中添加autodispose解决rxjava内存泄漏(代码片段)

...09;:RxLifecycle详解及原理分析中,详细阐述了如何通过使用RxLifecycle解决Android开发中RxJava的可能会导致的内存泄漏问题;RxLifecycle内部的实现原理;在文章的最后,我提到了AutoDispose这个库,这个库同样 查看详情

解决:setstate()calledafterdispose()内存泄漏问题(代码片段)

...再次调用setState就会报 setState()calledafterdispose()。二、解决方案State的mounted源码:///Whetherthis[State]objecti 查看详情

如何解决内存溢出以及内存泄漏(代码片段)

...到过内存溢出问题,其实说白了就是内存不够用了,那么要解决这个问题,我们就需要“开源节流”了1.开源(增加内存分配)每台手机给每个程序分配的内存都是固定的,那么是否有办法使我们的程序获取到更大的内存呢?其实是有的,... 查看详情

es6weakmap和weakset的使用场景

...决这个问题,ES6还引入了另外两种新的数据结构,即称为WeakMap和WeakSet的弱集合。这些集合之所以是“弱的”,是因为它们允许从内存中清除不再需要的被这些集合所引用的对象。 查看详情

es6:数据结构set和map&weakset和weakmap(代码片段)

ES6:数据结构Set和Map&WeakSet和WeakMapSet基本使用常见方法WeakSetWeakSet的特点基本使用WeakMap的应用Map基本使用常见方法WeakMapWeakMap的特点强引用和弱引用在ES6以前存储数据的结构有两种:数组和对象。在ES6中新增两种数据结构:Set... 查看详情

哪些操作会造成内存泄漏以及如何解决内存泄漏(代码片段)

...存泄漏内存泄漏含义:1.造成内存泄漏的情况1.11.21.32.解决内存泄漏的方式2.1globalvariables:2.2使用timers或者callbacks2.3闭包可以访问外部(封闭)函数变量的内部函数2.4DOM引用内存泄漏含义:内存泄漏指任何对象在不... 查看详情

一个线程内存泄漏问题定位过程(代码片段)

...否存在内存泄漏:想到内存泄漏,首先查看/proc/meminfo,通过/proc/meminfo可以看出总体内存在下降。确定内存泄漏确实存在。top中可以显示多种形式内存,进而可以判断是那种泄漏。比如vss/rs 查看详情

android性能优化之利用leakcanary检测内存泄漏及解决办法(转)(代码片段)

利用LeakCanary检测内存泄漏及解决办法利用LeakCanary检测内存泄漏及解决办法什么是内存泄漏内存泄漏造成什么影响什么是LeakCanaryLeakCanary捕获常见内存泄漏以及解决办法错误使用单例造成的内存泄漏Handler造成的内存泄漏线程造成... 查看详情

es6:数据结构set和map&weakset和weakmap(代码片段)

ES6:数据结构Set和Map&WeakSet和WeakMapSet基本使用常见方法WeakSetWeakSet的特点基本使用WeakMap的应用Map基本使用常见方法WeakMapWeakMap的特点强引用和弱引用在ES6以前存储数据的结构有两种:数组和对象。在ES6中新增两种数据... 查看详情

什么是内存泄漏?该如何检测?又该如何解决?(代码片段)

...是写出俩内存泄漏案例,然后问如何排查?如何解决?本篇文章大体结构来自外国大佬ba 查看详情

一个线程内存泄漏问题定位过程(代码片段)

...泄漏:想到内存泄漏,首先查看/proc/meminfo,通过/proc/meminfo可以看出总体内存在下降。确定内存泄漏确实存在。top中可以显示多种形式内存,进而可以判断是那种泄漏。比如vss/rss/pss等。确定哪个进程内存泄漏࿱... 查看详情

智能指针不是解决内存泄漏的万能良药(代码片段)

背景最近在重构一个模块,模块中的接口有指针参数,我想把他改成智能指针,凡是接口要保持不变,就很难修改。接口类似func(int**p1),不知道怎么用shared_ptr代表。然后我就进行了一系列骚操作!从而也... 查看详情

智能指针(解决你的内存泄漏)(代码片段)

智能指针1、为什么需要智能指针?2、内存泄漏2.1什么是内存泄漏,内存泄漏的危害2.2内存泄漏分类(了解)2.3如何检测内存泄漏(了解)2.4如何避免内存泄漏3、智能指针的使用及原理3.1RAII3.2智能指针的... 查看详情

iPhone内存泄漏问题?

...2010-12-3005:40:02【问题描述】:此代码片段内存泄漏,如何解决此内存泄漏?-(NSDictionary*)sanitizedFinancialLine:(NSDictionary*)theFinancialLineNSMutableDictionary*aFinancialLine=[NSMutableDictionary 查看详情

内存泄漏mvp模式中的内存泄漏以及解决方案(代码片段)

...vity的引用。那么这个Activity对象就没有办法被回收。怎么解决这个内存泄漏? 在Activ 查看详情

(转)netty开发调试设置定位内存泄漏(代码片段)

...代理最近几天总是报OOM,重启不用太久就报错,通过Netty的参数进行检查发现一些问题,在网上找到一些资料,下面这篇比较直接解决问题,转载如下:偶然一次再测试环境看到netty出现内存泄漏的日志ÿ... 查看详情

了解内存泄漏的根源(代码片段)

...#xff0c;怎么去看代码是否会有内存泄漏,以及要怎么去解决。 查看详情

javascriptweakmap(代码片段)

文章目录前言一、为何选用WeakMap1.Map2.WeakMap二、WeakMap原型方法总结前言我在处理一个复杂对象的深拷贝方法时接触到WeakMap,其作为缓存结构以解决对象内部的循环引用问题.为了改造这个方法,决定研究WeakMap.一、为何选用WeakMapWeak... 查看详情