1、 replaceAll - 全部替换
js 默认的 replace 方法仅替换字符串中一个模式的第一个实例,要全局替换,你需要自己写正则,因此 ES2021 带来了全新的 replaceAll 方法。
"Hello".replaceAll("l", "L"); // 'HeLLo'
2、Promise.any Promise 的短路返回
1. 这是 Promise 全局对象的静态方法,可以放 Promise 数组,只要有一个 Promise 完成解析,就短路返回一个值。如果所有的 promise 都被拒绝,那么它将抛出一个汇总错误消息)。
2. 该特性基本和原有的 Promise.all 功能相反。
示例:短路返回
Promise.any([
new Promise((resolve, reject) => setTimeout(reject, 200, "Third")),
new Promise((resolve, reject) => setTimeout(resolve, 1000, "Second")),
new Promise((resolve, reject) => setTimeout(resolve, 2000, "First")),
])
.then((value) => console.log(Result: ${value}))
.catch((err) => console.log(err));
/**** Output ****/
// Result: Second
示例:错误处理
Promise.any([
new Promise((resolve, reject) => setTimeout(reject, 200, "Third")),
new Promise((resolve, reject) => setTimeout(reject, 1000, "Second")),
new Promise((resolve, reject) => setTimeout(reject, 2000, "First")),
])
.then((value) => console.log(Result: ${value}))
.catch((err) => console.log(err));
/**** Output ****/
// AggregateError: All promises were rejected
3、 WeakRef 弱引用
这是一个新类,用于创建对对象的弱引用,即不会阻止被引用对象被垃圾收集的引用,Java 中有类似的实现。
let obj = { name: "Andy" };
const myRef = new WeakRef(obj);
然后,可以像这样获取包装的对象:
myRef.deref(); // { name: "Andy" }
如果垃圾收集器已经将其从内存中删除,它将返回 undefined。
4、逻辑运算符与赋值表达式
在 JavaScript 中有许多赋值运算符和逻辑运算符,例如:
// Assignment Operator Example
let num = 5;
num += 10;
console.log(num); // 15
// Logical Operator Example
let num1 = 6;
let num2 = 3;
console.log(num1 === 6 && num2 === 2); // false
console.log(num1 === 6 || num2 === 2); // true
ES2021 让我们将能把逻辑运算符和赋值运算符结合起来。
他们看起来像这样:
a ||= b;
a &&= b;
a ??= b;
这里解释下它们的工作原理:
a ||= b;
// 等价于
1. a = a || b
2. if (!a) a = b
a &&= b;
// 等价于
1. a = a && b
2. if (a) a = b
a ??= b;
// 等价于
1. a = a ?? b
2. if (a === undefined || a === null) a = b
5、_ 数值分隔符
新引入的数值分隔符使用 _(下划线)字符,在数值组之间提供分隔,使数值读起来更容易。
// 原写法
let num = 1000000000;
// 新写法 - 可读性发生了变化
let billion = 1_000_000_000;