ECMAScript 2021
ECMAScript 2021(ES12)于 2021 年 6 月发布。
核心特性
1. String.prototype.replaceAll() 方法
String.prototype.replaceAll()
方法,用于替换字符串中所有匹配的子字符串
。以前,replace()
只能替换第一个匹配项,而 replaceAll()
解决了这个问题,允许一次性替换所有匹配项。
const str = "apple banana apple orange";
const newStr = str.replaceAll("apple", "kiwi");
console.log(newStr); // 'kiwi banana kiwi orange'
影响:
- 简化字符串替换:避免了使用正则表达式替代所有匹配项的复杂度。
- 更简洁的代码:使得多次替换操作更加清晰和易读。
2. Promise.any() 方法
Promise.any()
方法,它接受一个可迭代的 Promise 集合
,返回一个新的 Promise。这个新的 Promise 会在集合中的任何一个 Promise 成功时立即解决。如果所有 Promise 都被拒绝,则返回一个拒绝状态的 Promise。
一个成功即成功
const p1 = Promise.reject("Error 1");
const p2 = Promise.resolve("Success 2");
const p3 = Promise.reject("Error 3");
Promise.any([p1, p2, p3])
.then((value) => console.log(value)) // 'Success 2'
.catch((error) => console.log(error));
影响:
- 处理多个异步操作:当有多个 Promise 时,Promise.any() 允许你仅关注第一个成功的 Promise,避免等待所有 Promise 都完成。
- 提高异步处理效率:特别适用于需要在多个异步操作中选取最快完成的结果的场景。
3. WeakRefs(弱引用)
WeakRef
为开发者提供了一种创建弱引用的方式。弱引用不会阻止垃圾回收机制回收其引用的对象。它适用于需要手动控制对象内存管理的场景,比如缓存机制。
let target = { name: "Alice" };
let weakRef = new WeakRef(target);
let deref = weakRef.deref();
console.log(deref.name); // 'Alice'
影响:
- 内存管理:提供了一种管理大型对象或缓存的方式,防止其在不需要时长时间占用内存。
- 适用于缓存机制:当对象不再有强引用时,JavaScript 可以自动回收它。
4. Logical Assignment Operators(逻辑赋值运算符)
引入了三种新的逻辑赋值运算符:&&=
, ||=
, 和 ??=
。它们结合了逻辑操作符和赋值操作,简化了代码中常见的逻辑判断和赋值操作。
let a = null;
a ||= "Default Value"; // 如果 a 为 null 或 undefined,则赋值
console.log(a); // 'Default Value'
let b = 0;
b &&= 10; // 如果 b 为 falsy 值,则不改变 b
console.log(b); // 0
let c = null;
c ??= "Fallback Value"; // 如果 c 为 null 或 undefined,则赋值
console.log(c); // 'Fallback Value'
影响:
- 简化赋值逻辑:这些新运算符使得代码更加简洁,尤其是在需要结合逻辑判断和赋值的场景。
- 提高代码可读性:开发者可以通过单一表达式处理逻辑操作和赋值,而不需要冗长的条件判断。
5. Array.prototype.at() 方法
Array
类增加了 at()
方法,允许使用负数索引从数组的末尾访问元素。这种方法简化了访问数组末尾元素的过程。
const arr = [1, 2, 3, 4];
console.log(arr.at(-1)); // 4 (最后一个元素)
console.log(arr.at(-2)); // 3 (倒数第二个元素)
影响:
- 更方便地访问数组元素:通过负数索引,开发者可以轻松地访问数组的最后几个元素,避免使用 arr.length - 1。
- 提升代码简洁性:简化了访问数组末尾元素的代码逻辑。
6. Object.hasOwn() 方法
Object.hasOwn()
方法提供了一种更安全的方式来检查对象是否拥有某个属性。与 Object.prototype.hasOwnProperty()
相比,Object.hasOwn()
方法更简洁并且避免了由于 null 或 undefined 产生的错误。
const obj = { name: "Alice" };
console.log(Object.hasOwn(obj, "name")); // true
console.log(Object.hasOwn(obj, "age")); // false
影响:
- 代码更简洁:减少了 hasOwnProperty 的调用,并提高了代码的安全性。
- 增强健壮性:不再需要检查对象是否为 null 或 undefined,避免了潜在的运行时错误。
兼容性
注:兼容性数据可能随着版本的更新而有所调整,建议开发者根据项目的具体需求参考最新的浏览器版本和 Polyfill 支持情况。
总结
ECMAScript 2021(ES12)引入了一些重要的特性,极大地提升了 JavaScript 语言的功能性和简洁性。尤其是在字符串操作、异步处理、数组操作和内存管理等方面,ES2021 提供了更为简洁和高效的解决方案。这些特性使得开发者在编写现代 JavaScript 应用时能够更加高效和轻松地处理常见的编程任务。
参考文献