Map和WeakMap的区别

个人总结:
map对key强引用,当weakmap引用了一个key的时候,(内存堆空间的)实际key内容不会被垃圾回收掉。 (有内存泄漏风险)
weakmap对key弱引用,实际的key可能在某次垃圾回收操作时被清除掉,导致weakmap中的这对key-value也会消失掉。



引用计数:https://zh.wikipedia.org/wiki/%E5%BC%95%E7%94%A8%E8%AE%A1%E6%95%B0
只要存在计数,就不会被垃圾回收机制回收。

强引用:引用并计数
只要引用存在,垃圾回收器永远不会回收。
弱引用:只引用 不计数
会垃圾回收机制回收。

强引用与弱引用本质是两种不同的指针

 

在Chrome中跑下面代码:

 var map = new Map();

{

  let  x  = {

    a:[1,2]

  };

   map.set(x,'something');

}

console.log(map);

 

map是在{}这样的一个scope中定义的,scope结束后x会被垃圾回收掉,但是map强引用了x ,所以x不会被辣鸡回收机制回收,所以这里是可以打印出map的。

 

 

 var map = new WeakMap();

{

  let  x  = {

    a:[1,2]

  };

   map.set(x,'something');

}

console.log(map);

 

WeakMap对x属于弱引用,只有引用,没有计数,当经过{}语句块时垃圾回收判断没有计数了,于是删除掉了x,所以这里打印出的map中长度是0。

 

 
   

 

 以上只在Chrome浏览器控制台第一次运行有效 因为垃圾回收会受有自定的引擎优化算法影响 在Edge下试了几次都保证有效 ( Microsoft Edge 42.17134.1.0 )

 

转载于:https://www.cnblogs.com/eret9616/p/9134548.html

你可能感兴趣的:(Map和WeakMap的区别)