# 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 里面的键名对象和所对应的键值就会被自动消失。不用手动删除引用。