map和weakmap的不同
map
map作为es6新加的一种键值对类型结构,更对象比起来有很多的优化。比如:
对象只能以string或者symbol类型作为键,map可以是任何类型,甚至是对象。
对象上面有一些默认的键,map默认情况下不包含任何键,所有键都是自己添加进去的。
map的键值对个数可以轻易通过size属性获取,对象需要通过手动计算。
map在频繁删除键值对的场景下性能比对象好。
map的实例属性和方法
- set
设置键值对,然后返回整个map结构。如果key已经存在,则会更新value值。并且可以通过链式写法设置多组值。
const newMap = new Map().set(1, 'a').set(2, 'b');
-
get
读取key对于的键值,如果传入的键值不存在,则会返回undefined。 -
has
判断传入的键是否存在当前map对象中,返回一个boolean值。 -
delete
删除传入的键,返回一个boolean值。 -
clear
清除所有成员,没有返回值。
遍历方法
可以使用for...of和forEach遍历。因为map实例会维护键值对的插入顺序,所以会根据插入顺序进行遍历。
WeakMap
weakMap和map是兄弟关系,API只有set,get,has,delete。
weakMap的特性
weakmap只能将对象作为键名(null除外),不接受其他类型的值作为键名。
weakmap的键名引用的对象是弱引用。(我一直把这个搞错了)
先搞懂什么叫弱引用,强引用.
- 什么是强引用?
const obj = {name: 'ces'};
const arr = [ [obj, '对象'] ];
上面代码中,obj是一个对象,arr数组用到了obj对象。这样形成了对obj的引用,这种引用又是强引用。区别就在于,如果我们不再需要这个对象了,必须手动的删除这个引用,解除arr和obj的引用关系,否则垃圾回收机制不会释放obj占用的内存。因为,arr存在对obj的引用。
- 什么是弱引用?
百度百科的答案:在计算机程序设计中,弱引用与强引用相对,是指不能确保其引用对象不会被垃圾回收器回收的引用。一个对象若只被弱引用所引用,则被认为是不可访问的,并因此可能在任何时刻被回收。
也就是说,如果创建了一个弱引用对象,如果不再需要,weakmap中的键名对象和所对应的键值对会自动消失,不再手动删除引用。
所以,因为weakmap对键名所引用的对象是弱引用关系,因此weakMap内部成员是会取决于垃圾回收机制有没有执行,运行前后的成员个数可能不一样,而垃圾回收机制是不可预测的,所以weakmap不可以遍历。
总结
map的键可以是任何类型,weakmap只接受对象作为键(null除外),不接受其他类型的值作为键。
map的键实际上是跟内存地址绑定的,只要内存地址不一样,就视为两个键;weakmap的键是弱引用,键所指向的对象可以被垃圾回收,此时的键是无效的。
map可以被遍历,weakmap不可以被遍历。
行百里者半九十