详解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中的location用法简单介绍
Mar 07 Javascript
javascript中match函数的用法小结
Feb 08 Javascript
jquery库或JS文件在eclipse下报错问题解决方法
Apr 17 Javascript
JavaScript中的数组操作介绍
Dec 30 Javascript
JavaScript将一个数组插入到另一个数组的方法
Mar 19 Javascript
js获取元素的外链样式的简单实现方法
Jun 06 Javascript
jQuery AJAX timeout 超时问题详解
Jun 21 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
Mar 30 Javascript
vue-resource + json-server模拟数据的方法
Nov 02 Javascript
解决JSON.stringify()自动将中文转译成unicode的问题
Jan 05 Javascript
Vue.js中Line第三方登录api的实现代码
Jun 29 Javascript
vue封装自定义指令之动态显示title操作(溢出显示,不溢出不显示)
Nov 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
php操作xml入门之cdata区段
2015/01/23 PHP
Laravel 5框架学习之环境与配置
2015/04/08 PHP
在laravel中使用Symfony的Crawler组件分析HTML
2017/06/19 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
使用AngularJS处理单选框和复选框的简单方法
2015/06/19 Javascript
jquery中val()方法是从最后一个选项往前读取的
2015/09/06 Javascript
jquery+ajax实现直接提交表单实例分析
2016/06/17 Javascript
基于jQuery实现页面搜索功能
2020/03/26 Javascript
AngularJS控制器之间的通信方式详解
2016/11/03 Javascript
vue router嵌套路由在history模式下刷新无法渲染页面问题的解决方法
2018/01/25 Javascript
微信小程序实现长按删除图片的示例
2018/05/18 Javascript
更改BootStrap popover的默认样式及popover简单用法
2018/09/13 Javascript
vue自定义键盘信息、监听数据变化的方法示例【基于vm.$watch】
2019/03/16 Javascript
详解VUE项目中安装和使用vant组件
2019/04/28 Javascript
vue接入腾讯防水墙代码
2019/05/07 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
jQuery实现可编辑的表格
2019/12/11 jQuery
[01:14:30]TNC vs VG 2019国际邀请赛淘汰赛 胜者组赛BO3 第二场 8.20.mp4
2019/08/22 DOTA
python中MySQLdb模块用法实例
2014/11/10 Python
python实现windows壁纸定期更换功能
2019/01/21 Python
Python实现从SQL型数据库读写dataframe型数据的方法【基于pandas】
2019/03/18 Python
python3实现微型的web服务器
2019/09/03 Python
python路径的写法及目录的获取方式
2019/12/26 Python
Python3如何在Windows和Linux上打包
2020/02/25 Python
Python如何安装第三方模块
2020/05/28 Python
世界著名的顶级牛排:Omaha Steak(奥马哈牛排)
2016/09/20 全球购物
英国时尚首饰品牌:Missoma
2020/06/29 全球购物
node中使用shell脚本的方法步骤
2021/03/23 Javascript
保护黄河倡议书
2014/05/16 职场文书
企业管理标语
2014/06/10 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
岳麓书院导游词
2015/02/03 职场文书
立春观后感
2015/06/18 职场文书
html5中sharedWorker实现多页面通信的示例代码
2021/05/07 Javascript
CSS中calc(100%-100px)不加空格不生效
2023/05/07 HTML / CSS