详解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 相关文章推荐
functional继承模式 摘自javascript:the good parts
Jun 20 Javascript
javascript计时器事件使用详解
Jan 07 Javascript
Node.js中使用Buffer编码、解码二进制数据详解
Aug 16 Javascript
javascript中定义类的方法详解
Feb 10 Javascript
JS判断输入字符串长度实例代码(汉字算两个字符,字母数字算一个)
Aug 02 Javascript
jquery获取input type=text中的值的各种方式(总结)
Dec 02 Javascript
Bootstrap php制作动态分页标签
Dec 23 Javascript
Vue.js:使用Vue-Router 2实现路由功能介绍
Feb 22 Javascript
Angular 2 ngForm中的ngModel、[ngModel]和[(ngModel)]的写法
Jun 29 Javascript
转换layUI的数据表格中的日期格式方法
Sep 19 Javascript
Node.js API详解之 timer模块用法实例分析
May 07 Javascript
详解如何在Canvas中添加事件的方法
Apr 17 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
php学习笔记之面向对象编程
2012/12/29 PHP
PHP小偷程序的设计与实现方法详解
2016/10/15 PHP
thinkPHP5.0框架整体架构总览【应用,模块,MVC,驱动,行为,命名空间等】
2017/03/25 PHP
详解如何在云服务器上部署Laravel
2017/06/30 PHP
php自定义排序uasort函数示例【二维数组按指定键值排序】
2019/06/19 PHP
PHP实现图片防盗链破解操作示例【解决图片防盗链问题/反向代理】
2020/05/29 PHP
音乐播放用的的几个函数
2006/09/07 Javascript
AngularJS学习笔记之TodoMVC的分析
2015/02/22 Javascript
JavaScript判断是否为数字的4种方法及效率比较
2015/04/01 Javascript
jQuery消息提示框插件Tipso
2015/05/04 Javascript
JavaScript编程中window的location与history对象详解
2015/10/26 Javascript
jQuery+CSS实现滑动的标签分栏切换效果
2015/12/17 Javascript
javascript每日必学之循环
2016/02/19 Javascript
jQuery插件ajaxfileupload.js实现上传文件
2020/10/23 Javascript
jQuery文本框得到与失去焦点动态改变样式效果
2016/09/08 Javascript
15个非常实用的JavaScript代码片段
2016/12/18 Javascript
初探nodeJS
2017/01/24 NodeJs
基于Vue实现图书管理功能
2017/10/17 Javascript
基于dataset的使用和图片延时加载的实现方法
2017/12/11 Javascript
vue2.0 兄弟组件(平级)通讯的实现代码
2018/01/15 Javascript
从零学Python之hello world
2014/05/21 Python
在Python中操作字符串之rstrip()方法的使用
2015/05/19 Python
Python科学计算之NumPy入门教程
2017/01/15 Python
Python编写一个闹钟功能
2017/07/11 Python
简单了解python模块概念
2018/01/11 Python
python实现按长宽比缩放图片
2018/06/07 Python
Django项目后台不挂断运行的方法
2019/08/31 Python
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
超市实习总结自我鉴定
2013/09/19 职场文书
应付会计岗位职责
2013/12/12 职场文书
小学中秋节活动方案
2014/02/06 职场文书
公司节能减排方案
2014/05/16 职场文书
小学安全工作总结2015
2015/05/18 职场文书
不知如何爱孩子,这些方法教会您
2019/08/06 职场文书
Python爬虫之爬取二手房信息
2021/04/27 Python
mysql查看表结构的三种方法总结
2022/07/07 MySQL