ES2021 更新的內(nèi)容!

2021 年 6 月 22 日,發(fā)布了 ES2021 標(biāo)準(zhǔn),Github 鏈接https://github.com/tc39/ecma262/releases/tag/es2021 。標(biāo)準(zhǔn)在每年的 6 月份正式發(fā)布一次,作為當(dāng)年的正式版本。
任何人都可以向標(biāo)準(zhǔn)委員會(huì)(又稱 TC39 委員會(huì))提案,要求修改語(yǔ)言標(biāo)準(zhǔn)。
一種新的語(yǔ)法從提案到變成正式標(biāo)準(zhǔn),需要經(jīng)歷五個(gè)階段。每個(gè)階段的變動(dòng)都需要由 TC39 委員會(huì)批準(zhǔn)。
1、Stage 0 - Strawman(展示階段)
2、Stage 1 - Proposal(征求意見階段)
3、Stage 2 - Draft(草案階段)
4、Stage 3 - Candidate(候選人階段)
5、Stage 4 - Finished(定案階段)
一個(gè)提案只要能進(jìn)入 Stage 2,就差不多肯定會(huì)包括在以后的正式標(biāo)準(zhǔn)里面。ECMAScript 當(dāng)前的所有提案,可以在 TC39 的官方網(wǎng)站 https://tc39.es/ecma262 查看。
更新內(nèi)容
This specification, the 12th edition, introduces the
replaceAllmethod for Strings;Promise.any, a Promise combinator that short-circuits when an input value is fulfilled;AggregateError, a new Error type to represent multiple errors at once; logical assignment operators (??=,&&=,||=);WeakRef, for referring to a target object without preserving it from garbage collection, andFinalizationRegistry, to manage registration and unregistration of cleanup operations performed when target objects are garbage collected; separators for numeric literals (1_000); andArray.prototype.sortwas made more precise, reducing the amount of cases that result in an implementation-defined sort order.
上面是原文內(nèi)容,簡(jiǎn)要介紹了 JavaScript 今年新加了哪些語(yǔ)法,還好不是很多。
主要有5個(gè)新特性:
1、邏輯賦值運(yùn)算符:(??=, &&=, ||=)
2、數(shù)字分隔符:(1_000)
3、Promise.any & AggregateError
4、String.prototype.replaceAll
5、WeakRefs & FinalizationRegistry 對(duì)象
快速上手
邏輯賦值運(yùn)算符
ES2021 引入了三個(gè)新的邏輯賦值運(yùn)算符,將邏輯運(yùn)算符與賦值運(yùn)算符進(jìn)行結(jié)合。
// 或賦值運(yùn)算符x ||= y// 等同于x || (x = y)// 與賦值運(yùn)算符x &&= y// 等同于x && (x = y)// Null 賦值運(yùn)算符x ??= y// 等同于x ?? (x = y)
這三個(gè)運(yùn)算符 ||=、&&=、?? =相當(dāng)于先進(jìn)行邏輯運(yùn)算,然后根據(jù)運(yùn)算結(jié)果,再視情況進(jìn)行賦值運(yùn)算。
它們的一個(gè)用途是,為變量或?qū)傩栽O(shè)置默認(rèn)值。
// 老的寫法user.id = user.id || 1;// 新的寫法user.id ||= 1;
上面示例中,user.id 屬性如果不存在,則設(shè)為 1,新的寫法比老的寫法更緊湊一些。
數(shù)字分隔符
ES2021,允許 JavaScript 的數(shù)值使用下劃線(_)作為分隔符。
let budget = 1_000_000_000_000;budget === 10 ** 12 // truebudget === 1000000000000
String.prototype.replaceAll
之前,字符串的實(shí)例方法 replace() 只能替換第一個(gè)匹配。
'aabbcc'.replace('b', '_')// 'aa_bcc'
上面例子中,replace() 只將第一個(gè) b 替換成了下劃線。
如果要替換所有的匹配,不得不使用正則表達(dá)式的 g 修飾符。
'aabbcc'.replace(/b/g, '_')// 'aa__cc'
正則表達(dá)式畢竟不是那么方便和直觀,ES2021 引入了 replaceAll() 方法,可以一次性替換所有匹配。
'aabbcc'.replaceAll('b', '_')// 'aa__cc'
它的用法與 replace() 相同,返回一個(gè)新字符串,不會(huì)改變?cè)址?/p>
WeakRef
WeakSet 和 WeakMap 是基于弱引用的數(shù)據(jù)結(jié)構(gòu),ES2021 更進(jìn)一步,提供了 WeakRef 對(duì)象,用于直接創(chuàng)建對(duì)象的弱引用。
let target = {};let wr = new WeakRef(target);
上面示例中,target 是原始對(duì)象,構(gòu)造函數(shù) WeakRef() 創(chuàng)建了一個(gè)基于 target 的新對(duì)象 wr。這里,wr 就是一個(gè) WeakRef 的實(shí)例,屬于對(duì) target 的弱引用,垃圾回收機(jī)制不會(huì)計(jì)入這個(gè)引用,也就是說(shuō),wr 的引用不會(huì)妨礙原始對(duì)象 target 被垃圾回收機(jī)制清除。
FinalizationRegistry
ES2021 引入了清理器注冊(cè)表功能 FinalizationRegistry,用來(lái)指定目標(biāo)對(duì)象被垃圾回收機(jī)制清除以后,所要執(zhí)行的回調(diào)函數(shù)。
首先,新建一個(gè)注冊(cè)表實(shí)例。
const registry = new FinalizationRegistry(heldValue => {// ....});
上面代碼中,F(xiàn)inalizationRegistry() 是系統(tǒng)提供的構(gòu)造函數(shù),返回一個(gè)清理器注冊(cè)表實(shí)例,里面登記了所要執(zhí)行的回調(diào)函數(shù)?;卣{(diào)函數(shù)作為 FinalizationRegistry() 的參數(shù)傳入,它本身有一個(gè)參數(shù) heldValue。
然后,注冊(cè)表實(shí)例的 register() 方法,用來(lái)注冊(cè)所要觀察的目標(biāo)對(duì)象。
registry.register(theObject, "some value");上面示例中,theObject 就是所要觀察的目標(biāo)對(duì)象,一旦該對(duì)象被垃圾回收機(jī)制清除,注冊(cè)表就會(huì)在清除完成后,調(diào)用早前注冊(cè)的回調(diào)函數(shù),并將 some value 作為參數(shù)(前面的 heldValue)傳入回調(diào)函數(shù)。
了解 Promise.any 可以查看之前的文章:鏈接
