從 ES2021 到 ES2023 的 13 個實用的 JavaScript 新功能
以下是 ECMAScript 從 ES2021 到 ES2023 中引入的一些有用且令人興奮的功能:
ES2021
- String.prototype.replaceAll():使用該方法可以替換字符串中出現(xiàn)的所有子串。
- 邏輯賦值運算符(&&=、||=、??=):這些運算符將邏輯運算符(AND、OR、nullish coalescing)與賦值相結合
ES2022(擬議)
- Array.prototype.groupBy():該提案引入了一種新方法,允許根據(jù)提供的函數(shù)對數(shù)組元素進行分組。
- String.prototype.sliceSet():該功能旨在增強現(xiàn)有的 slice() 方法,允許使用切片語法替換字符串中的子串。
ES2023(擬議)
- Realms API:該提案引入了 "境界 "的概念,即隔離、獨立的 JavaScript 代碼執(zhí)行環(huán)境。它可以提高安全性,并將應用程序的不同部分分離開來。
- Temporal:這一新的內置庫旨在為 JavaScript 中日期和時間的處理提供更好的方法,解決現(xiàn)有 Date 對象的一些問題。
- Record 和 Tuple:這個提案引入了新的數(shù)據(jù)結構,分別類似于對象和數(shù)組,具有特定的固定鍵或元素類型。Record 擁有命名屬性,而 Tuple 則具有固定長度和有序元素。
- Promise.any():這個方法返回一個 promise,該promise以迭代器中第一個實現(xiàn)的承諾的值為滿足條件。它與 Promise.all() 相反。
- Promise.try():該提議引入了基于 Promise 的 try-catch 代碼塊,允許以一致的方式處理同步和異步錯誤。
- WeakRefs:弱引用允許我們創(chuàng)建對對象的引用,而不阻止它們被垃圾收集。這在諸如緩存或管理內存密集型對象的場景中可能非常有用。
- Object.observe():該提案建議添加一個新方法,提供一種觀察對象變化的方式,類似于 Object.defineProperty() 允許觀察特定屬性變化的方式。
- 管道操作符該提案引入了一個新的操作符(|>),可讓我們以更易讀、更簡潔的方式組成函數(shù),類似于其他編程語言中管道操作符的工作方式。
- 錯誤原因:這個提案建議為 Error 對象添加一個 cause 屬性,允許我們捕獲錯誤的根本原因并提供更多上下文。
請注意,提到的 ES2022 和 ES2023 的特性目前還處于提案階段,可能會經歷變更,或者最終不會被納入正式規(guī)范。查看官方 ECMAScript 文檔或關注 TC39 委員會的討論,以獲取這些特性的最新更新,總是一個好主意。
下面是功能說明和代碼示例:
ES2021
1、String.prototype.replaceAll():
const str = 'Hello, World!';
const replacedStr = str.replaceAll('o', '0');
console.log(replacedStr); // Hell0, W0rld!
2、邏輯賦值運算符(&&=、||=、??=):
let x = 5;
let y = 10;
x &&= y;
console.log(x); // 10
let a = false;
let b = true;
a ||= b;
console.log(a); // true
let c = null;
let d = 'default';
c ??= d;
console.log(c); // default
ES2022
3、Array.prototype.groupBy()
const numbers = [1, 2, 3, 4, 5, 6];
const grouped = numbers.groupBy((num) => num % 2 === 0 ? 'even' : 'odd');
console.log(grouped);
// Output: { odd: [1, 3, 5], even: [2, 4, 6] }
4、String.prototype.sliceSet()
let str = 'Hello, World!';
str.sliceSet(7, 12, 'Earth');
console.log(str); // Hello, Earth!
ES2023
5、Realms API
該功能沒有附帶具體的代碼示例,因為它更像是對 JavaScript 運行環(huán)境的概念性補充。
6、Temporal
該功能引入了一個新的內置庫。下面是一個簡化示例:
const date = Temporal.now.date();
console.log(date.year); // 2023
console.log(date.month); // 6
console.log(date.day); // 2
7、Record and Tuple
const person: Record<string, string> = { name: 'John', age: '30' };
console.log(person.name); // John
type Point = [number, number];
const coordinates: Point = [10, 5];
console.log(coordinates[0]); // 10
8、Promise.any()
const promises = [
Promise.reject('Error 1'),
Promise.resolve('Success 2'),
Promise.reject('Error 3')
];
Promise.any(promises)
.then((result) => console.log(result)) // Success 2
.catch((error) => console.log(error));
9、Promise.try()
const synchronousTask = () => {
throw new Error('Oops!');
};
Promise.try(synchronousTask)
.then(() => console.log('Success'))
.catch((error) => console.log(error)); // Error: Oops!
10、WeakRefs
該功能比較復雜,涉及需要跟蹤對象弱引用的情況。下面是一個簡單的例子:
let obj = { data: 'example' };
const weakRef = new WeakRef(obj);
obj = null;
setTimeout(() => {
const recoveredObj = weakRef.deref();
console.log(recoveredObj); // { data: 'example' }
}, 1000);
11、Object.observe()
該提案目前處于第二階段,還沒有可用的代碼示例。
12、管道操作符
該功能允許以更易讀的方式連鎖函數(shù):
const add = (x, y) => x + y;
const multiplyBy2 = (num) => num * 2;
const subtract = (x, y) => x - y;
const result = 5 |> add(3) |> multiplyBy2 |> subtract(10);
console.log(result); // -1
13、錯誤原因
該提案建議在錯誤對象中添加 cause 屬性,為錯誤提供更多上下文信息:
const error1 = new Error('Error 1');
const error2 = new Error('Error 2');
error1.cause = error2;
console.log(error1.cause.message); // Error 2
請記住,ES2022 和 ES2023 提出的特性可能會根據(jù) TC39 委員會正在進行的討論和最終審批而發(fā)生變化。