let obj={name:'张三'}
//{name:'张三'}这个对象能够被读取到,因为obj这个变量名对它的引用
//将引用覆盖掉
obj=null
//这个对象将会被从内存中移除,因为我们已经失去了对他的所有引用
let obj={name:'张三'}
let arr=[obj]
obj=null
//对象{name:'张三'}不会被从内存中移除,因为数组arr保存了对它的引用
强引用和弱引用之间的区别
-
js中绝大多数变量都保存着对一个对象的强引用,比如上面数组保存着对对象{name:'张三}的强引用
-
如果一个变量保存着对一个对象的强引用,那么这个对象将不会被垃圾回收,但是如果一个变量只保存者对这个对象的弱引用,那么这个对象将会被垃圾回收
-
一个变量类型在对象上有一个弱引用,就是Weakmap的情况
Map和Weakmap的比较
-
使用Map,对象会占用内存,可能不会被垃圾回收,Map对对象是强引用
let obj={name:'张三'}
let mapObj=new Map()
mapObj.set(obj,'any value')
obj=null
-
Weakmap则完全不同,她不会阻止关键对象的垃圾回收
-
Weakmap只接受object作为key,他只保存对对象的弱引用
let obj={name:'张三'}
let weakmapObj=new WeakMap()
weakmapObj.set(obj,'any value')
obj=null
-
对象被垃圾回收器删除,因为weakmap对象{name:'张三'}上只有弱引用,二这个对象已经没有强引用了(只有变量obj有保持引用)
-
当我们对一个不再使用的对象保持引用的时候将会造成内存泄漏,如果你不再使用对象,需要删除它的任何变量引用。