强引用
1 .将对象保存在内存之中的引用,会防止垃圾回收
let cat={name:"kitty"}
//创建一个cat对象
const pets=[cat]
//把这个对象放入到一个数组里面
const petObj={value:cat}
//把这个对象放到一个对象里面
cat=null
console.log(cats)
//[name:"kitty"]
console.log(catObjs)

//可以看到cat虽然变成了null,但是在arr,obj里面都是正常显示的
//虽然我们再也无法访问cat变量,但是由于pets数组和这个对象之间存在强引用关系,因此这个对象其实任然保存在内存中.可以通过pets[0]访问到他
2 .强引用可以防止垃圾回收从内存中删除对象.除非我们主动把这个对象设为null
弱引用
1 .对对象的引用,但是不被使用,会被垃圾回收机制所清除
let pets=new WeakMap()
let cat={name:"kitty"}
pets.set(cat,"kitty")
console.log(pets)
cat=null
console.log(pets)

//看到竟然是没变化,下面不是说设为null会触发垃圾回收么?
2 .为避免内存泄漏,一旦数据不再使用,最好通过将其值设为null来释放其引用,这个方法叫做接触引用.也就是说定义为null会触发一次垃圾回收
3 .一个对象若只被弱引用所引用,则被认为是不可访问的,因此可以再任何时候被回收。这里的不能访问描述有点错误。官方文档是不能循环,没有自己的遍历方法
4 .这里他们是看的node才看出来了
总结
默认情况下,JavaScript 对其所有引用使用强引用,使用弱引用的唯一方法是使用 WeakMap 或 WeakSet
网友评论