Skip to content

ECMAScript 2021

ECMAScript 2021(ES12)于 2021 年 6 月发布。

核心特性

1. String.prototype.replaceAll() 方法

String.prototype.replaceAll() 方法,用于替换字符串中所有匹配的子字符串。以前,replace() 只能替换第一个匹配项,而 replaceAll() 解决了这个问题,允许一次性替换所有匹配项。

javascript
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。

一个成功即成功

javascript
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 为开发者提供了一种创建弱引用的方式。弱引用不会阻止垃圾回收机制回收其引用的对象。它适用于需要手动控制对象内存管理的场景,比如缓存机制。

javascript
let target = { name: "Alice" };
let weakRef = new WeakRef(target);

let deref = weakRef.deref();
console.log(deref.name); // 'Alice'

影响

  • 内存管理:提供了一种管理大型对象或缓存的方式,防止其在不需要时长时间占用内存。
  • 适用于缓存机制:当对象不再有强引用时,JavaScript 可以自动回收它。

4. Logical Assignment Operators(逻辑赋值运算符)

引入了三种新的逻辑赋值运算符:&&=, ||=, 和 ??=。它们结合了逻辑操作符和赋值操作,简化了代码中常见的逻辑判断和赋值操作。

javascript
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() 方法,允许使用负数索引从数组的末尾访问元素。这种方法简化了访问数组末尾元素的过程。

javascript
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 产生的错误。

javascript
const obj = { name: "Alice" };
console.log(Object.hasOwn(obj, "name")); // true
console.log(Object.hasOwn(obj, "age")); // false

影响

  • 代码更简洁:减少了 hasOwnProperty 的调用,并提高了代码的安全性。
  • 增强健壮性:不再需要检查对象是否为 null 或 undefined,避免了潜在的运行时错误。

兼容性

Chrome 91+
Firefox 89+
Safari 14.0+
Edge 91+
Node 16.0+

注:兼容性数据可能随着版本的更新而有所调整,建议开发者根据项目的具体需求参考最新的浏览器版本和 Polyfill 支持情况。

总结

ECMAScript 2021(ES12)引入了一些重要的特性,极大地提升了 JavaScript 语言的功能性和简洁性。尤其是在字符串操作、异步处理、数组操作和内存管理等方面,ES2021 提供了更为简洁和高效的解决方案。这些特性使得开发者在编写现代 JavaScript 应用时能够更加高效和轻松地处理常见的编程任务。

参考文献

ECMA-262 2021 规范 👉

Released under the MIT License.