美文网首页ES 6写法
Map与WeakMap详解

Map与WeakMap详解

作者: 景元合 | 来源:发表于2020-03-04 20:45 被阅读0次

前言

今天有个要将对象作为键的需求,传统的Object不能满足,因此特意巩固一下Map的用法,在此记录一下。

Map

类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object 结构提供了“字符串—值”的对应,Map 结构提供了“值—值”的对应,是一种更完善的 Hash 结构实现。如果你需要“键值对”的数据结构,Map 比 Object 更合适。

引自:https://es6.ruanyifeng.com/#docs/set-map#Map

用法

  • 对象作为key
const m=new Map();
const o={p:'hello world'};
m.set(o,'content');
console.log(m.get(o))//content

上面用法就是将object对象作为m的key,同时使用get方法得到这个key的值。

  • 数组作为key
const m=new Map([['name','张三'],['age',15]]);
console.log(m.has('name'))//true
console.log(m.has('age'))//true
console.log(m.get('name'))//张三
console.log(m.get('age'))//15
console.log(m.get('sex'))//undefined

上面代码在新建 Map 实例时,就指定了两个键name、age,get方法读取key对应的键值,如果找不到key,返回undefined。

  • 遍历方法
    Map.prototype.keys():返回键名的遍历器。
    Map.prototype.values():返回键值的遍历器。
    Map.prototype.entries():返回所有成员的遍历器。
    Map.prototype.forEach():遍历 Map 的所有成员。
const m=new Map([['name','张三'],['age',15],['sex']]);
for(let key of m.keys()){
    console.log(key)
}
for(let value of m.values()){
    console.log(value)
}
for(let item of m.entries()){
    console.log(item[0],item[1])
}
m.forEach((value,key)=>{
    console.log(value,key)
})
  • 与其他数据结构的互相转换


//Map转数组
const m=new Map([['name','张三'],['age',15],['sex']]);
console.log([...m])
//Map转为对象
const o=new Map();
o.set('name','张三');
o.set('age',13);
function mapToObj(str){
    let obj=Object.create(null);
    for(let [k,v] of str){
      obj[k]=v;
    }
    return obj
}
console.log(mapToObj(o));
//对象转为 Map
let obj = {"a":1, "b":2};
let map = new Map(Object.entries(obj));

WeakMap

WeakMap结构与Map结构类似,也是用于生成键值对的集合
首先,WeakMap只接受对象作为键名(null除外),不接受其他类型的值作为键名
其次,WeakMap的键名所指向的对象,不计入垃圾回收机制
它的键名所引用的对象都是弱引用,即垃圾回收机制不将该引用考虑在内。因此,只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占用的内存。也就是说,一旦不再需要,WeakMap 里面的键名对象和所对应的键值对会自动消失,不用手动删除引用
WeakMap 与 Map 在 API 上的区别主要是两个,一是没有遍历操作(即没有keys()、values()和entries()方法),也没有size属性。因为没有办法列出所有键名,某个键名是否存在完全不可预测,跟垃圾回收机制是否运行相关。这一刻可以取到键名,下一刻垃圾回收机制突然运行了,这个键名就没了,为了防止出现不确定性,就统一规定不能取到键名。二是无法清空,即不支持clear方法。因此,WeakMap只有四个方法可用:get()、set()、has()、delete()。

WeakMap 的用途

WeakMap 应用的典型场合就是 DOM 节点作为键名

let myWeakmap = new WeakMap();
myWeakmap.set(
  document.getElementById('logo'),
  {timesClicked: 0})
;
document.getElementById('logo').addEventListener('click', function() {
  let logoData = myWeakmap.get(document.getElementById('logo'));
  logoData.timesClicked++;
}, false);

上面代码中,document.getElementById('logo')是一个 DOM 节点,每当发生click事件,就更新一下状态。我们将这个状态作为键值放在 WeakMap 里,对应的键名就是这个节点对象。一旦这个 DOM 节点删除,该状态就会自动消失,不存在内存泄漏风险。

相关文章

  • Map与WeakMap详解

    前言 今天有个要将对象作为键的需求,传统的Object不能满足,因此特意巩固一下Map的用法,在此记录一下。 Ma...

  • WeakMap的学习与应用场景

    WeakMap 是什么? WeakMap 与 Map 类似,也是生成 键值对的组合,但是有区别:1.WeakMap...

  • es6 WeakMap - 2019-01-13

    2019-01-13 创建 WeakMap与Map的区别: WeakMap只接受对象作为键名(null除外),不接...

  • Set WeakSet Map WeakMap

    Set SetWeak Map WeakMap

  • 24.WeakMap

    WeakMap WeakMap 是 Map 的弱引用,它也是在 Map 的基础上有了一些限制和自己的特性。 没有 ...

  • JS 预编译执行顺序

    1.WeakMap的键名只支持对象,map的键名可以是任意值。 2. Map可以遍历,WeakMap不可以 3. ...

  • es6 map与weakmap与array对比以及应用

    map & weakMap map是一个个key&value的键值对,与object的不同是map的键可以是任何类...

  • ES6学习笔记(四)

    十五、Map和WeakMap 1、Map 用途:类似json,但是 json 的键(key)只能是字符串 ​ ...

  • ES6中的Map

    今天小编和大家一起探讨一下引用类型中的map,在其中会有一些map与数组联合应用,还有和map类似的weakmap...

  • Set Map WeakSet WeakMap

    本文转自博客:Set、WeakSet、Map及WeakMap Set 和 Map 主要的应用场景在于 数据重组 和...

网友评论

    本文标题:Map与WeakMap详解

    本文链接:https://www.haomeiwen.com/subject/qqlilhtx.html