ES2021(ES12)新特性解讀

ECMAScript語言規(guī)范的第12個版本發(fā)布(ES2021)。來看看怎么使用它們。

String.prototype.replaceAll

原有的 replace 如果不用正則表達(dá)式只能替換一個,相信不少初學(xué)者都塌過這個坑。

const a = '112233';
a.replace('1', 'x');  // x12233

如果想要全部替換,我們只能借助全局的正則表達(dá)式:

a.replace(/1/g, 'x');  // xx2233

現(xiàn)在使用 replaceAll 不用正則也能達(dá)到一樣的效果,而且更加直觀:

a.replaceAll('1', 'x');  // xx2233

Promise.any & AggregateError

all, race, allSettled 這些批處理方法后,又迎來了一個新的 any。

race 接收 promise 數(shù)組中第一個 reslove 的值作為自身的 reslove,也就是說只要有一個 fulfilled ,它也會是 fulfilled 狀態(tài)。舉個例子:

const a = Promise.resolve("ok");
const b = Promise.reject("err1");
const c = Promise.reject("err2");

Promise.any([a, b, c]).then(ret => {
  console.log(ret);  // ok
});

而當(dāng)所有 promise 都 rejected 時,那么它將拋出一個 AggregateError 匯總錯誤消息:

const a = Promise.reject("err1");
const b = Promise.reject("err2");
const c = Promise.reject("err3");

Promise.any([a, b, c]).catch(err => {
  console.log(err.errors);  // ['err1', 'err2', 'err3']
});

Logical assignment operators(邏輯賦值運算符)

??, &&, || 這三也加入了賦值運算符中,舉個例子比較形象:

// 原有
a = a ?? b;
a = a && b;
a = a || b;

// 新的
a ??= b;
a &&= b;
a ||= b; 

注:跟 a += b 一樣,會改變 a 的值,所以不能 const a。

WeakRef & FinalizationRegistry(弱引用和垃圾回收監(jiān)聽)

WeakRef

在一般情況下,對象的引用是強引用的,這意味著只要持有對象的引用,它就不會被垃圾回收。只有當(dāng)該對象沒有任何的強引用時,垃圾回收才會銷毀該對象并且回收該對象所占的內(nèi)存空間。

WeakRef 允許您保留對另一個對象的弱引用,而不會阻止被弱引用對象被垃圾回收。

Constructor(object)

const target = { key: "value" };
const ref = new WeakRef(target);

WeakRef.prototype.deref()

deref方法返回實例的目標(biāo)對象,如果目標(biāo)對象已被垃圾回收,則返回undefined

const targetObj = ref.deref();
if (targetObj) {
  console.log(targetObj.key); // value
} 

FinalizationRegistry

FinalizationRegistry 可以讓你在對象被垃圾回收時執(zhí)行回調(diào)。

Constructor(callback)

先注冊好回調(diào):

const registry = new FinalizationRegistry(heldValue => {
  console.log(heldValue);
});

FinalizationRegistry.prototype.register(target, heldValue[, unregisterToken])

其中

  • target 就是目標(biāo)對象
  • heldValue 就是回調(diào)時可以讀取到的值,類型不限
  • unregisterToken 可選,取消監(jiān)聽的引用,要求是 object,一般可以放目標(biāo)對象
registry.register(theObject, {"useful": "info about target"});

FinalizationRegistry.prototype.unregister(unregisterToken)

registry.register(theObject, "some value", theObject);
registry.unregister(theObject);

注:這兩個特性謹(jǐn)慎使用。

Numeric literal separator(數(shù)字分隔符)

為了提高大數(shù)字的可讀性,現(xiàn)在可以用 _ 作為數(shù)字的分隔符:

const num = 1_000_000_000 // 1000000000

類似于我們經(jīng)??吹降?1,000,000,000,當(dāng)然分割線的形式?jīng)]強制要求隔3位才分割。

Array.prototype.sort

這次也提到了,數(shù)組 sort 這個特性已經(jīng)穩(wěn)定了,早先在 ES2019 已經(jīng)明確要求,詳見ES2019(ES10)帶來的9個新特性

合集

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容