# Map和WeakMap的区别
# Map
Map 本质上是健值对的集合。Map 数据结构类型于对象,但是它的键不限制范围,可以是任意的类型,是一种更加完善的 hash 结构。如果 Map 的键是一个原始数据类型,只有键严格相同,才能看为使同一个键。
const map = [['name', '张三'], ['age', 18]]
Map 的操作方法。
- size
- set(key, value). 返回整个Map结构,key存在的话,就会被更新。
- get(key) 找到就返回 key,否则返回 undefined.
- has(key) 返回布尔值。
- delete(key) 删除某个键,返回true。如果删除失败,返回false。
- clear() 清除所有成员,没有返回值。
Map 结构原生提供三个遍历器和一个遍历方法。
- keys() 返回键名的遍历器。
- values() 返回键值的遍历器。
- entries() 返回所有成员的遍历器。
- forEach() 遍历Map的所有成员。
const map = new Map([
['foo', 1],
['bar', 2]
])
for (let key of map.keys()) {
key; // foo bar
}
for (let value of map.values()) {
value; // 1 2
}
for (let items of map.entries()) {
items; // ['foo', 1] ['bar', 2]
}
map.forEach((value, key, map) => {
key, value; // foo 1 var 2
})
# WeakMap
WeakMap 对象也是一组键值对的集合,键是弱引用的。其键必须是对象,原始数据类型不能作为 key 值。而值可以是任意的。
方法。
- set(key, value);
- get(key)
- has(key)
- delete(key)
- clear 方法被弃用了,可以通过创建一个空的 WeakMap 并替换原来的对象来实现清除。
# WeakMap设计目的
WeakMap 设计目的在于,有时想在某个对象上面存放一些数据,但是这会形成对这个对象的引用。一旦不需要这两个对象,就必须手动删除这个引用,否则垃圾回收就不会释放对象占用的内存。
而 WeakMap 的键名所引用的对象都是弱引用的,垃圾回收不会将该引用考虑在内。只要所引用的对象的其他引用都被清除,垃圾回收机制就会释放该对象所占有的内存。一旦不在需要,WeakMap 里面的键名对象和所对应的键值就会被自动消失。不用手动删除引用。