详解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两种function的定义介绍及区别说明
May 02 Javascript
屏蔽IE弹出&quot;您查看的网页正在试图关闭窗口,是否关闭此窗口&quot;的方法
Dec 31 Javascript
jquery+ajax+C#实现无刷新操作数据库数据的简单实例
Feb 08 Javascript
Jquery 垂直多级手风琴菜单附源码下载
Nov 17 Javascript
jQuery序列化表单成对象的简单实现
Nov 29 Javascript
微信小程序链接传参并跳转新页面
Nov 29 Javascript
JS原生带小白点轮播图实例讲解
Jul 22 Javascript
微信小程序实现手势图案锁屏功能
Jan 30 Javascript
自定义vue组件发布到npm的方法
May 09 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
Feb 27 jQuery
微信小程序云开发实现数据添加、查询和分页
May 17 Javascript
JS+CSS实现炫酷光感效果
Sep 05 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
什么是短波收听SWL
2021/03/01 无线电
Can't create/write to file 'C:\WINDOWS\TEMP\...MYSQL报错解决方法
2011/06/30 PHP
在Mac OS上编译安装Nginx+PHP+MariaDB开发环境的教程
2016/02/23 PHP
php和vue配合使用技巧和方法
2019/05/09 PHP
JS动态显示表格上下frame的方法
2015/03/31 Javascript
js 获取经纬度的实现方法
2016/06/20 Javascript
AngularJS通过$location获取及改变当前页面的URL
2016/09/23 Javascript
完美解决js传递参数中加号和&amp;号自动改变的方法
2016/10/11 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
使用grunt合并压缩js和css文件的方法
2017/03/02 Javascript
Ajax高级笔记 JavaScript高级程序设计笔记
2017/06/22 Javascript
js实现登录与注册界面
2017/11/01 Javascript
vue-cli常用设置总结
2018/02/24 Javascript
angular学习之动态创建表单的方法
2018/12/07 Javascript
vue配置font-awesome5的方法步骤
2019/01/27 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
Vue组件基础用法详解
2020/02/05 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
[02:31]2018年度DOTA2最具人气选手-完美盛典
2018/12/16 DOTA
python中List的sort方法指南
2014/09/01 Python
python中字典dict常用操作方法实例总结
2015/04/04 Python
Python正则表达式和元字符详解
2018/11/29 Python
如何利用Pyecharts可视化微信好友
2019/07/04 Python
python 普通克里金(Kriging)法的实现
2019/12/19 Python
从当地商店送来的杂货:Instacart
2018/08/19 全球购物
初级会计求职信范文
2014/02/15 职场文书
《吃水不忘挖井人》教学反思
2014/04/15 职场文书
英语故事演讲稿
2014/04/29 职场文书
舞蹈兴趣小组活动总结
2014/07/07 职场文书
大学生创业计划书
2014/08/14 职场文书
中级会计大学生职业生涯规划书
2014/09/16 职场文书
党员批评与自我批评总结
2014/10/15 职场文书
只用20行Python代码实现屏幕录制功能
2021/06/02 Python
业余无线电通联Q语
2022/02/18 无线电
centos环境下nginx高可用集群的搭建指南
2022/07/23 Servers