详解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代码
Jan 28 Javascript
Javascript 函数parseInt()转换时出现bug问题
May 20 Javascript
后台获取ZTREE选中节点的方法
Feb 12 Javascript
JavaScript如何实现在文本框(密码框)输入提示语
Dec 25 Javascript
js 动态添加元素(div、li、img等)及设置属性的方法
Jul 19 Javascript
炫酷的js手风琴效果
Oct 13 Javascript
基于JS实现bookstore静态页面的实例代码
Feb 22 Javascript
Bootstrap3下拉菜单的实现
Feb 22 Javascript
如何去除vue项目中的#及其ie9兼容性
Jan 11 Javascript
详解JS数值Number类型
Feb 07 Javascript
微信小程序倒计时功能实例代码
Jul 17 Javascript
原生JS实现轮播图效果
Oct 12 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
调整优化您的LAMP应用程序的5种简单方法
2011/06/26 PHP
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
php数组索引的Key加引号和不加引号的区别
2014/08/19 PHP
jQuery点击tr实现checkbox选中的方法
2013/03/19 Javascript
ext中store.load跟store.reload的区别示例介绍
2014/06/17 Javascript
基于jquery固定于顶部的导航响应浏览器滚动条事件
2014/11/02 Javascript
jQuery的position()方法详解
2015/07/19 Javascript
js实现继承的5种方式
2015/12/01 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
jQuery之动画效果大全
2016/11/09 Javascript
Extjs让combobox写起来简洁又漂亮
2017/01/05 Javascript
jqGrid翻页时数据选中丢失问题的解决办法
2017/02/13 Javascript
JS实现移动端判断上拉和下滑功能
2017/08/07 Javascript
js实现可以点击收缩或张开的悬浮窗
2017/09/18 Javascript
利用JS动态生成隔行换色HTML表格的两种方法
2018/10/09 Javascript
基于Proxy的小程序状态管理实现
2019/06/14 Javascript
vue动态配置模板 'component is'代码
2019/07/04 Javascript
微信小程序webSocket的使用方法
2020/02/20 Javascript
Python实战小程序利用matplotlib模块画图代码分享
2017/12/09 Python
解决python写入mysql中datetime类型遇到的问题
2018/06/21 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
python制作图片缩略图
2019/04/30 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
Django模板导入母版继承和自定义返回Html片段过程解析
2019/09/18 Python
Python 根据数据模板创建shapefile的实现
2019/11/26 Python
Python版中国省市经纬度
2020/02/11 Python
html5 横向滑动导航栏的方法示例
2020/05/08 HTML / CSS
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
简单的大学生自我鉴定
2014/02/18 职场文书
庆元旦迎新年广播稿
2014/02/18 职场文书
团代会主持词
2014/04/02 职场文书
党纪处分决定书
2015/06/24 职场文书
2016高考冲刺决心书
2015/09/23 职场文书
python对文档中元素删除,替换操作
2022/04/02 Python
通过feDisplacementMap和feImage实现水波特效
2022/04/24 HTML / CSS