前言
Map
和 WeakMap
是Es6新增的一种集合类型。采用键值对存储,可能你这时会想,对象 Object
也是采用键值对存储,为什么还需要这两个Map
和WeakMap
的键可以是对象,而对象的键只能是字符串。这无疑为 Map
和 WeakMap
增加了许多可能性。
一丶使用
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")
复制代码
二丶区别
- 你会发现在使用上
WeakMap
和Map
并无太大差异,但需要注意的是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
复制代码
三丶测试WeakMap
和 Map
。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END