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個新特性。
合集
- ES2021(ES12)新特性解讀
- ES2020(ES11)帶來的新特性
- ES2019(ES10)帶來的9個新特性
- ES2018(ES9)新特性
- ES2017(ES8)新特性
- ES2016(ES7)新特性