JavaScript学习笔记12-ES12

1. FinalizationRegistry

  • FinalizationRegistry 对象可以在对象被垃圾回收时请求一个回调
    • FinalizationRegistry 提供了这样的一种方法:当一个在注册表中注册的对象被回收时,请求在某个时间点上调用一个清理回调。(清理回调有时被称为 finalizer )
    • 可以通过调用register方法,注册任何想要清理回调的对象,传入该对象和所含的值
    • 代码在node环境的控制台下执行是从上到下执行后就关闭进程了,而FinalizationRegistry的回调清理并不是与其同时进行的。需要在浏览器中运行,监听浏览器中的控制台
1
2
3
4
5
6
7
8
9
10
11
let obj = {
uname: "why"
}

const registry = new FinalizationRegistry(value=>{
console.log("对象被销毁",value);
});

registry.register(obj,"obj");

obj = null;

2. WeakRefs

  • 将一个对象赋值给另外一个引用时,这个引用是一个强引用
  • 如果希望是一个弱引用的话,可以使用WeakRef
  • deref()
    • 如果原对象没有销毁,那么可以获取到原对象
    • 如果原对象已经销毁,那获取到的是undefined
1
2
3
4
5
6
7
8
9
10
11
12
13
14
let obj = {
uname: "why"
}

let info = new WeakRef(obj);

// why
console.log(info.deref().uname);

const registry = new FinalizationRegistry(value=>{
console.log("对象被销毁",value);
});
registry.register(obj,"obj");
obj = null;
  • 当info=obj时,就是强引用,即使让obj=null,清理时obj也不会被回收;当info=WeakRef(obj)时,就是弱引用,obj=null后,obj就可以被回收

3. logical assignment operators

3.1. 逻辑或运算符

1
2
3
4
5
6
7
// 逻辑或
let message = ""

// message = message || "Hello World"
message ||= "Hello World";
// Hello World
console.log(message);

3.2. 逻辑与运算符

1
2
3
4
5
6
7
8
// 逻辑与
let obj = {
uname: "why"
}
// obj = obj&& obj.uname
obj &&= obj.uname;
// why
console.log(obj);

3.3. 逻辑空运算符

1
2
3
4
5
// 逻辑空
let foo = null;
foo ??= "default value";
// default value
console.log(foo);
本文结束  感谢您的阅读