ES2021
ES2021 带来了字符串的全局替换、新的 Promise 方法以及更简洁的赋值运算符。
1. 逻辑赋值操作符 (&&=, ||=, ??=)
结合了逻辑运算符和赋值运算符,让代码更加简练。
let a = 1;
let b = 0;
a ||= 2; // 等价于 a = a || 2 (a 仍为 1)
b ??= 3; // 等价于 b = b ?? 3 (b 变为 0,因为 b 不是 null/undefined)
2. String.prototype.replaceAll()
一次性替换字符串中所有匹配的子串。以前需要使用带 /g 标志的正则表达式。
const str = "apple apple apple";
console.log(str.replaceAll("apple", "orange")); // "orange orange orange"
3. Promise.any()
接收一个 Promise 数组,只要其中的任意一个 Promise 成功(fulfilled),就返回那个已经成功的 Promise。如果所有的 Promise 都失败(rejected),则返回一个特殊的 AggregateError 错误。
Promise.any([
fetch('/api/server1').catch(() => null),
fetch('/api/server2').catch(() => null)
]).then(firstSuccess => console.log(firstSuccess));
4. 数字分隔符 (Numeric Separators)
允许在数字字面量中使用下划线 _ 作为分隔符,使大数字更易读。引擎解析时会自动忽略这些下划线。
const billion = 1_000_000_000;
const bytes = 0xFF_FF_FF_FF;
5. WeakRef (弱引用)
允许创建一个对对象的弱引用。由于是弱引用,它不会阻止垃圾回收器(GC)回收该对象。可以使用 deref() 方法在对象被回收前获取该对象。这在缓存大型对象时非常有用,能有效避免内存泄漏。
let obj = { data: 'some data' };
const weakRef = new WeakRef(obj);
// 在某个时刻,如果你需要用到这个对象
const ref = weakRef.deref();
if (ref) {
console.log(ref.data);
} else {
console.log('对象已被垃圾回收');
}