map和weakmap的不同

map

map作为es6新加的一种键值对类型结构,更对象比起来有很多的优化。比如:
对象只能以string或者symbol类型作为键,map可以是任何类型,甚至是对象。
对象上面有一些默认的键,map默认情况下不包含任何键,所有键都是自己添加进去的。
map的键值对个数可以轻易通过size属性获取,对象需要通过手动计算。
map在频繁删除键值对的场景下性能比对象好。

map的实例属性和方法

  1. set
    设置键值对,然后返回整个map结构。如果key已经存在,则会更新value值。并且可以通过链式写法设置多组值。
const newMap = new Map().set(1, 'a').set(2, 'b');
  1. get
    读取key对于的键值,如果传入的键值不存在,则会返回undefined。

  2. has
    判断传入的键是否存在当前map对象中,返回一个boolean值。

  3. delete
    删除传入的键,返回一个boolean值。

  4. clear
    清除所有成员,没有返回值。

遍历方法

可以使用for...of和forEach遍历。因为map实例会维护键值对的插入顺序,所以会根据插入顺序进行遍历。

WeakMap

weakMap和map是兄弟关系,API只有set,get,has,delete。

weakMap的特性

weakmap只能将对象作为键名(null除外),不接受其他类型的值作为键名。
weakmap的键名引用的对象是弱引用。(我一直把这个搞错了)
先搞懂什么叫弱引用,强引用.

  1. 什么是强引用?
const obj = {name: 'ces'};
const arr = [ [obj, '对象'] ];

上面代码中,obj是一个对象,arr数组用到了obj对象。这样形成了对obj的引用,这种引用又是强引用。区别就在于,如果我们不再需要这个对象了,必须手动的删除这个引用,解除arr和obj的引用关系,否则垃圾回收机制不会释放obj占用的内存。因为,arr存在对obj的引用。

  1. 什么是弱引用?
    百度百科的答案:在计算机程序设计中,弱引用与强引用相对,是指不能确保其引用对象不会被垃圾回收器回收的引用。一个对象若只被弱引用所引用,则被认为是不可访问的,并因此可能在任何时刻被回收。
    也就是说,如果创建了一个弱引用对象,如果不再需要,weakmap中的键名对象和所对应的键值对会自动消失,不再手动删除引用。

所以,因为weakmap对键名所引用的对象是弱引用关系,因此weakMap内部成员是会取决于垃圾回收机制有没有执行,运行前后的成员个数可能不一样,而垃圾回收机制是不可预测的,所以weakmap不可以遍历。

总结

map的键可以是任何类型,weakmap只接受对象作为键(null除外),不接受其他类型的值作为键。
map的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键;weakmap的键是弱引用,键所指向的对象可以被垃圾回收,此时的键是无效的。
map可以被遍历,weakmap不可以被遍历。

posted @ 2023-02-02 10:21  卿六  阅读(497)  评论(0编辑  收藏  举报