详解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 相关文章推荐
js获取单选按钮的数据
Nov 27 Javascript
javascript十个最常用的自定义函数(中文版)
Sep 07 Javascript
AlertBox 弹出层信息提示框效果实现步骤
Oct 11 Javascript
js中使用DOM复制(克隆)指定节点名数据到新的XML文件中的代码
Jul 27 Javascript
js获取location.href的参数实例代码
Aug 02 Javascript
createTextRange()的使用示例含文本框选中部分文字内容
Feb 24 Javascript
JavaScript原生对象之String对象的属性和方法详解
Mar 13 Javascript
Angular2搜索和重置按钮过场动画
May 24 Javascript
浅谈在node.js进入文件目录的问题
May 13 Javascript
教你使用vue-cli快速构建的小说阅读器
May 13 Javascript
微信小程序之侧边栏滑动实现过程解析(附完整源码)
Aug 23 Javascript
Element实现动态表格的示例代码
Aug 02 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/08/16 PHP
PHP禁止个别IP访问网站
2013/10/30 PHP
php实现批量删除挂马文件及批量替换页面内容完整实例
2016/07/08 PHP
PHP中字符与字节的区别及字符串与字节转换示例
2016/10/15 PHP
div拖拽插件——JQ.MoveBox.js(自制JQ插件)
2013/05/17 Javascript
jquery及原生js获取select下拉框选中的值示例
2013/10/25 Javascript
JS实现超过长度限制后自动跳转下一款文本框的方法
2015/02/23 Javascript
基于jquery fly插件实现加入购物车抛物线动画效果
2016/04/05 Javascript
Vue中fragment.js使用方法详解
2017/03/09 Javascript
妙用缓存调用链实现JS方法的重载
2018/04/30 Javascript
浅析node.js的模块加载机制
2018/05/25 Javascript
基于vue和react的spa进行按需加载的实现方法
2018/09/29 Javascript
JavaScript动态创建二维数组的方法示例
2019/02/01 Javascript
react-native滑动吸顶效果的实现过程
2019/06/03 Javascript
vue+element加入签名效果(移动端可用)
2019/06/17 Javascript
layui点击左侧导航栏,实现不刷新整个页面,只刷新局部的方法
2019/09/25 Javascript
微信小程序本地存储实现每日签到、连续签到功能
2019/10/09 Javascript
es6数组includes()用法实例分析
2020/04/18 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
完美解决安装完tensorflow后pip无法使用的问题
2018/06/11 Python
在Python中Dataframe通过print输出多行时显示省略号的实例
2018/12/22 Python
Python3简单实现串口通信的方法
2019/06/12 Python
python编写简单端口扫描器
2019/09/04 Python
python 基于dlib库的人脸检测的实现
2019/11/08 Python
Python基于BeautifulSoup爬取京东商品信息
2020/06/01 Python
CSS3色彩模式有哪些?CSS3 HSL色彩模式的定义
2016/04/26 HTML / CSS
含精油的天然有机化妆品:Indemne
2019/08/27 全球购物
Linux常见面试题
2013/03/18 面试题
三年大学生活自我鉴定
2014/01/21 职场文书
小加工厂管理制度
2014/01/21 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
四查四看剖析材料
2014/02/14 职场文书
班级旅游计划书
2014/05/03 职场文书
物业接待员岗位职责
2015/04/15 职场文书
MySQL 存储过程的优缺点分析
2021/05/20 MySQL
MySQL事务的隔离级别详情
2022/07/15 MySQL