提醒
如果您的Node版本较低,请更新,或者在浏览器中执行。
FinalizationRegistry
FinalizationRegistry(终结注册表)象可以让你在对象被垃圾回收时请求一个回调。FinalizationRegistry 提供了这样的一种方法:当一个在注册表中注册的对象被回收时,请求在某个时间点上调 用一个清理回调(清理回调有时被称为 finalizer)。你可以通过调用register方法,注册任何你想要清理回调的对象,传入该对象和所含的值。
const finalRegistry = new finalRegistry((value)=>{ //这个value是可选值
console.log("注册在finalRegistry的对象,某一个被摧毁",value);
})
let obj = {name:'why'}
let info = {age:18}
finalRegistry.register(obj) //注册对象
finalRegistry.register(info,"info") //第二个参数也可以传,会被当成回调函数的参数
obj = null //这就销毁了 GC不是实时的,它会定时来检查有没有无了的,可能要等待一会儿
info = null
WeakRef
如果我们默认将一个对象赋值给另外一个引用,那么这个引用是一个强引用,如果我们希望是一个弱引用的话,可以使用WeakRef。目前这个用的还不是特别多,除非你对内存管理要求非常精细。
//es12新增的 WeakRef类
//WeakRef.prototype.deref
//如果我们原对象没有销毁,可以获取到原对象
//如果原对象以及销毁,那么获取到的就是undefined
const finalRegistry = new FinalizationRegistry((value)=>{
console.log("注册在finalRegisry的对象,某一个被销毁",value);
})
let obj = {name:'why'}
// let info = obj 强引用
let info = new WeakRef(obj) //变成弱引用
finalRegistry.register(obj,"obj") //注册对象
// console.log(info);
console.log(info.deref().name); //需要通过deref()来拿到原来的对象
obj = null
setTimeout(()=>{ //如果我们想获取到的被销毁
console.log(info.deref()?.name);
})
logical assign operator
逻辑赋值运算
//逻辑赋值运算
// 1.||= 逻辑或赋值运算
// 2.&&= 逻辑与赋值预算
// 3.??= 逻辑空赋值运算
//逻辑或用的特别多
let message = "" // 0 or undefined
// message = message || "default value"
message ||= "default value"
//逻辑与用的情况比较少 ,判断Info
//看info有没有name属性有值的情况下,取出info.name
let info = {
name : 'why',
foo(){
console.log('foo被调用');
}
}
// info = info && info.name
info &&= info.name
console.log(info);
//3.??= 逻辑空赋值运算
// 有点类似逻辑或了 基本一样,但是他会把null undefined 0 看成false
let message2 = ""
message2 ??= 'default value'
console.log(message2);