详解ES6通过WeakMap解决内存泄漏问题


Posted in Javascript onMarch 09, 2018

一、Map

1.定义

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

2.语法

new Map([iterable])

属性

size:返回键值对的数量。

操作方法

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

遍历方法

  1. keys():返回键名的Iterator对象。
  2. values():返回键值的Iterator对象。
  3. entries():返回键值对的Iterator对象。
  4. 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])

方法

  1. set(key, value):设置(新增/更新)键key的值为value,返回WeakMap对象。
  2. get(key):读取键key的值,没有则返回undefined。
  3. has(key):判断一个WeakMap对象中是否存在某个键值对,返回true/false。
  4. 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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
javascript函数库-集合框架
Apr 27 Javascript
使用js获取QueryString的方法小结
Feb 28 Javascript
checkbox使用示例
Aug 23 Javascript
JS实现的一个简单的Autocomplete自动完成例子
Apr 16 Javascript
JS的encodeURI和java的URLDecoder.decode使用介绍
May 08 Javascript
jQuery实现的感应鼠标悬停图片色彩渐显效果
Mar 03 Javascript
基于JavaScript的操作系统你听说过吗?
Jan 28 Javascript
最丑的时钟效果!js canvas时钟制作方法
Aug 15 Javascript
原生js更改css样式的两种方式
Mar 15 Javascript
微信小程序实现多个按钮toggle功能的实例
Jun 13 Javascript
Node.js使用MySQL连接池的方法实例
Feb 11 Javascript
vue-router判断页面未登录自动跳转到登录页的方法示例
Nov 04 Javascript
JavaScript实现微信号随机切换代码
Mar 09 #Javascript
AngularJS中重新加载当前路由页面的方法
Mar 09 #Javascript
vue.js 底部导航栏 一级路由显示 子路由不显示的解决方法
Mar 09 #Javascript
vue+element-ui+ajax实现一个表格的实例
Mar 09 #Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
Mar 09 #Javascript
解决低版本的浏览器不支持es6的import问题
Mar 09 #Javascript
vuex实现登录状态的存储,未登录状态不允许浏览的方法
Mar 09 #Javascript
You might like
使用 eAccelerator加速PHP代码的方法
2007/09/30 PHP
destoon调用discuz论坛中带图片帖子的实现方法
2014/08/21 PHP
PHP获取网站中各文章的第一张图片的代码示例
2016/05/20 PHP
Laravel的throttle中间件失效问题解决方法
2016/10/09 PHP
PHP设计模式之策略模式原理与用法实例分析
2019/04/04 PHP
Laravel框架实现即点即改功能的方法分析
2019/10/31 PHP
幻宇的层模拟窗口效果-提供演示和下载
2007/01/20 Javascript
有关于JS构造函数的重载和工厂方法
2013/04/07 Javascript
jQuery学习笔记之toArray()
2014/06/09 Javascript
JavaScript通过function定义对象并给对象添加toString()方法实例分析
2015/03/23 Javascript
js实现简洁的TAB滑动门效果代码
2015/09/06 Javascript
js console.log打印对像与数组用法详解
2016/01/21 Javascript
AngularJS身份验证的方法
2016/02/17 Javascript
底部悬浮通栏可以关闭广告位的实现方法
2016/06/01 Javascript
Jquery获取当前城市的天气信息
2016/08/05 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
js 模仿锚点定位的实现方法
2016/11/19 Javascript
原生js实现下拉框功能(支持键盘事件)
2017/01/13 Javascript
AngularJS表格添加序号的方法
2017/03/03 Javascript
深入浅析JavaScript中的RegExp对象
2017/09/18 Javascript
[00:43]魔廷新尊——痛苦女王至宝捆绑包
2020/06/12 DOTA
Python装饰器decorator用法实例
2014/11/10 Python
Python中用max()方法求最大值的介绍
2015/05/15 Python
Python实现的十进制小数与二进制小数相互转换功能
2017/10/12 Python
对Python中for复合语句的使用示例讲解
2018/11/01 Python
详解Python logging调用Logger.info方法的处理过程
2019/02/12 Python
python3.6环境安装+pip环境配置教程图文详解
2019/06/20 Python
用Python画小女孩放风筝的示例
2019/11/23 Python
Windows下Pycharm远程连接虚拟机中Centos下的Python环境(图文教程详解)
2020/03/19 Python
Python实现初始化不同的变量类型为空值
2020/06/02 Python
亿企通软件测试面试题
2012/04/10 面试题
小学校园活动策划
2014/01/30 职场文书
森林防火宣传标语
2014/06/27 职场文书
中秋晚会致辞
2015/07/31 职场文书
《语言的突破》读后感3篇
2019/12/12 职场文书
教你用python实现12306余票查询
2021/06/30 Python