ES6-Map和WeakMap

前言

MapWeakMap 是Es6新增的一种集合类型。采用键值对存储,可能你这时会想,对象 Object 也是采用键值对存储,为什么还需要这两个MapWeakMap的键可以是对象,而对象的键只能是字符串。这无疑为 MapWeakMap 增加了许多可能性。

一丶使用

1. Map的使用

声明

const map = new Map() // 空Map
复制代码

设置值

map.set("key","value")
复制代码

取值

map.get("key");
复制代码

判断key是否存在

map.has("key")
复制代码

删除key

map.delete("key")
复制代码

循环遍历map

map.forEach(function(key){
  console.log("key",key)  //输出的是map中的value值
})
复制代码
2. WeakMap的使用

声明

const weakMap = new WeakMap();
复制代码

设置值

let key = {}
weakMap.set(key,"value")
复制代码

取值

weakMap.get("key")
复制代码

判断key是否存在

weakMap.get("key")
复制代码

二丶区别

  • 你会发现在使用上 WeakMapMap 并无太大差异,但需要注意的是WeakMap 存储的时候必须是对象,或者继承于 Object 的类型。

只要有一个键无效就会抛出错误,导致整个初始化失败

const weakMap2 = new WeakMap([ 
 [key1, "val1"], 
 ["BADKEY", "val2"], 
 [key3, "val3"] 
]); 
// TypeError: Invalid value used as WeakMap key 
typeof weakMap2; 
// ReferenceError: weakMap2 is not defined 
复制代码
  • WeakMap 对象是一组键/值对的集合,其中的键是弱引用的。

这意味着,我们无法对其进行枚举并且获得其 values

那什么又是弱引用呢?

如果其他对象都不再引用该对象,那么垃圾回收机制会自动回收该对象所占用的内存。

  • 对于不再使用的对象,可以使用 null 来覆盖对应对象的引用。
let obj = { key: "value" };
// obj是它的引用
obj = null; // 销毁引用
// 该对象将会被从内存中清除
复制代码

但是如果我们把对象存到数组里,单单把对象销毁,不销毁数组还是可以通过数组去到对象的值。

let obj = { key: "value" };
let array = [ obj ];
obj = null; // 销毁引用

// obj 被存储在数组里, 所以它不会被垃圾回收机制回收
// 我们可以通过 array[0] 来获取它
复制代码

同样,如果我们使用对象作为常规 Map 的键,那么当 Map 存在时,该对象也将存在。它会占用内存,并且不会被垃圾回收机制回收。

let obj = { key: "value" };

let map = new Map();
map.set(obj, "mapValue");
obj = null; // 销毁引用

// obj被存储在map中
// 使用map.keys()来获取
复制代码

如果我们使用 WeakMap 的话再来看看。

let obj = { key: "value" };
let weakMap = new WeakMap();
weakMap.set(obj, "mapValue");
obj = null; // 销毁引用

// 使用weakMap.keys() weakMap.keys is not a function
复制代码

三丶测试WeakMapMap

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享