Skip to content

Latest commit

 

History

History
147 lines (100 loc) · 4.05 KB

16_ES12.md

File metadata and controls

147 lines (100 loc) · 4.05 KB

ES12 - FinalizationRegistry

  • FinalizationRegistry 对象可以让你在对象被垃圾回收时请求一个回调。
    • FinalizationRegistry 提供了这样的一种方法:当一个在注册表中注册的对象被回收时,请求在某个时间点上调 用一个清理回调。(清理回调有时被称为 finalizer );
    • 你可以通过调用register方法,注册任何你想要清理回调的对象,传入该对象和所含的值;

image-20220607074648547

  • 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才会来把他回收掉,这个时候才会打印
 */

image-20220609074123321

  • obj1和obj就是传递的参数

ES12 - WeakRefs

  • 如果我们默认将一个对象赋值给另外一个引用,那么这个引用是一个强引用:
  • 如果我们希望是一个弱引用的话,可以使用WeakRef;

image-20220607074726547

要访问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;
})

用的不是很多

ES12 - logical assignment operators(逻辑赋值运算)

image-20220607074750025

  • 逻辑或赋值运算 ||=
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'

ES12其他知识点

  • Numeric Separator:讲过了;
// 数字分隔符
1_010_101_001
  • String.replaceAll:字符串替换;