- FinalizationRegistry 对象可以让你在对象被垃圾回收时请求一个回调。
- FinalizationRegistry 提供了这样的一种方法:当一个在注册表中注册的对象被回收时,请求在某个时间点上调 用一个清理回调。(清理回调有时被称为 finalizer );
- 你可以通过调用register方法,注册任何你想要清理回调的对象,传入该对象和所含的值;
- finalizationRegistry是一个类
- register是注册
- node在执行代码的时候,会开启一个进程,但是等代码执行到最后一行之后,node会把这个进程关掉,所以,可能存在回调没有打印的情况
- 浏览器不会这样
const finalRegistry = new FinalizationRegistry(() => {
console.log('注册在finalizationRegistry的对象,某一个销毁了')
})
let obj = {name: 'wts'};
finalRegistry.register(obj); //注册这个对象
obj = null
// 如果是两个对象, 他会打印两次
let obj1 = {name: 'wts111'};
finalRegistry.register(obj1);
obj1 = null;
// 那么怎么区分是哪个对象的打印呢
// 在注册的时候可以传递一个参数
let obj2 = {name: 'wts'};
let obj3 = {name: 'wts'};
const finalRegistry1 = new FinalizationRegistry((value) => {
console.log('注册在finalizationRegistry的对象,某一个销毁了', value)
})
finalRegistry1.register(obj2, 'obj')
finalRegistry1.register(obj3, 'obj1')
obj2 = null;
obj3 = null;
/**
* 当把obj置为null的时候,就会打印 注册在finalizationRegistry的对象,某一个销毁了
* 也就是说当这个对象被销毁的时候,这个打印就会出现
* 但是销毁机制GC,它是一种算法,不是说,只要obj被销毁了,他就会立即打印,而是等一个随机
* 的时间,GC才会来把他回收掉,这个时候才会打印
*/
- obj1和obj就是传递的参数
- 如果我们默认将一个对象赋值给另外一个引用,那么这个引用是一个强引用:
- 如果我们希望是一个弱引用的话,可以使用WeakRef;
要访问obj对象需要通过
info.deref().name
obj = null
setTimeout(() => {
console.log(info.deref().name) // cannot read properties of undefined(reading 'name')
}, 5000)
这样才能访问name属性
结论,如果原对象没有被销毁,可以获取到源对象,如果原对象被销毁,获取到的就是undefined,如果要做的话可以用可选链,或者逻辑与,或者判断
setTimeout(() => {
info.deref()?.name
info.deref() && info.deref().name;
})
用的不是很多
- 逻辑或赋值运算 ||=
let message = undefined;
// 或者message = ''
// 我们需要在message有值的时候使用Message, 如果message没有值就用默认值,我们以前可能会这样做
message = message || "default value";
// s使用逻辑或赋值运算以后可以这样做
message ||= 'default value' // 它的效果是一样的
它和 += 类似的
- 逻辑与赋值运算 &=
- 用的很少
let info = {
name: 'wts'
}
// 先判断info有没有值,有值的情况下取出name
info = info && info.name
// 也可以这样写
info &= info.name
- 逻辑空赋值运算 &=
let message = "";
// 这里的message是一个空字符串,会当成一个false,会把default value赋值给message
// message = 0,也会把message当成false
message ||= 'default value'
//当message = ''的时候 这个表达式的值是 '', 当message = 0的时候,这个表达式的值是0,当message = undefined/null的时候这个表达式的结果的default value
message ?? = 'default value'
- Numeric Separator:讲过了;
// 数字分隔符
1_010_101_001
- String.replaceAll:字符串替换;