详解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 相关文章推荐
JQuery操作iframe父页面与子页面的元素与方法(实例讲解)
Nov 20 Javascript
JS实现文字掉落效果的方法
May 06 Javascript
JS实现的文字与图片定时切换效果代码
Oct 06 Javascript
jQuery实现div随意拖动的实例代码(通用代码)
Jan 28 Javascript
JS 动态判断PC和手机浏览器实现代码
Sep 21 Javascript
AngularJS ng-repeat数组有重复值的解决方法
Oct 23 Javascript
Vue.js系列之项目结构说明(2)
Jan 03 Javascript
js实现显示手机号码效果
Mar 09 Javascript
详解Node.js中exports和module.exports的区别
Apr 19 Javascript
Angular4学习之Angular CLI的安装与使用教程
Jan 04 Javascript
JS XMLHttpRequest原理与使用方法深入详解
Apr 30 Javascript
js实现随机点名器精简版
Jun 29 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 中的面向对象编程:通向大型 PHP 工程的办法
2006/12/03 PHP
PHP获取当前相对于域名目录的方法
2015/06/26 PHP
PHP对象的浅复制与深复制的实例详解
2017/10/26 PHP
根据判断浏览器类型屏幕分辨率自动调用不同CSS的代码
2007/02/22 Javascript
javascript Select标记中options操作方法集合
2008/10/22 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
2013/02/26 Javascript
Javascript 遍历页面text控件详解
2014/01/06 Javascript
js 设置缓存及获取设置的缓存
2014/05/08 Javascript
5个JavaScript经典面试题
2014/10/13 Javascript
使用开源工具制作网页验证码的方法
2016/10/17 Javascript
jquery 正整数数字校验正则表达式
2017/01/10 Javascript
详解nodejs中exports和module.exports的区别
2017/02/17 NodeJs
nodejs+mongodb aggregate级联查询操作示例
2018/03/17 NodeJs
Vue-cli配置打包文件本地使用的教程图解
2018/08/02 Javascript
详解vue-cli下ESlint 配置说明
2018/09/03 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
基于JS+HTML实现弹窗提示是否确认提交功能
2020/06/17 Javascript
JavaScript实现音乐导航效果
2020/11/19 Javascript
微信小程序用户登录和登录态维护的实现
2020/12/10 Javascript
Python标准库defaultdict模块使用示例
2015/04/28 Python
基于python中staticmethod和classmethod的区别(详解)
2017/10/24 Python
Django实战之用户认证(用户登录与注销)
2018/07/16 Python
django多文件上传,form提交,多对多外键保存的实例
2019/08/06 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
2020/11/24 Python
美国维生素、补充剂、保健食品购物网站:Vitacost
2016/08/05 全球购物
蔻驰西班牙官网:COACH西班牙
2019/01/16 全球购物
生产现场工艺工程师岗位职责
2013/11/28 职场文书
结婚喜宴家长答谢词
2014/01/15 职场文书
高中生操行评语大全
2014/04/25 职场文书
导游词之黄帝陵景区
2019/09/16 职场文书
创业计划书之冷饮店
2019/09/27 职场文书
什么是动态刷新率DRR? Windows11动态刷新率功能介绍
2021/11/21 数码科技
vue3.0 数字翻牌组件的使用方法详解
2022/04/20 Vue.js
IDEA 2022 Translation 未知错误 翻译文档失败
2022/04/24 Java/Android
muduo TcpServer模块源码分析
2022/04/26 Redis