ECMASCRIPT 2021新功能程式碼演示案例
在這篇文章中,我們將透過程式碼示例探索一些最近釋出的 ECMAScript 2021 功能的用例。
ECMAScript 是構成 JavaScript 基礎的指令碼語言。
新功能:
- String.prototype.ReplaceAll()
- 弱引用
- Finalization註冊
- Promise.any()
- AggregateError
- 邏輯賦值運算子
- 數字文字的分隔符
String.prototype.ReplaceAll()
用例:
這個新功能可以替換字串中子字串的每個例項。這與舊的 String.prototype.Replace() 不同,後者僅替換子字串的第一次出現。
//with replace() const replaceMethodEg = "I felt happy because I saw the others were happy and because I knew I should feel happy"; console.log(replaceMethodEg.replace("happy", "sad")); // Output: I felt sad because I saw the others were happy and because I knew I should feel happy. //with replaceAll() const replaceAllMethodEg = "I felt happy because I saw the others were happy and because I knew I should feel happy"; console.log(replaceAllMethodEg.replaceAll("happy", "sad")); // Output: I felt sad because I saw the others were sad and because I knew I should feel sad. |
弱引用
WeakRef 允許您建立對物件的弱引用,而不會阻止 JavaScript 引擎的垃圾收集器回收該物件。對物件的正常(強)引用將物件儲存在記憶體中並防止物件被垃圾收集器銷燬。當一個物件不再有任何強引用時,JavaScript 引擎的垃圾收集器可能會銷燬該物件並回收其記憶體。如果發生這種情況,您將無法再從弱引用中獲取物件。
用例:
弱引用的主要用途是實現儲存大物件的快取或對映,在這種情況下,希望大物件不會僅僅因為它出現在快取或對映中而保持活動狀態
// An object to reference weakly const objToRef = { name: "Queen", age: 23, favColor: 'purple' }; // creating a WeakRef of this object const weakRefObj = new WeakRef(objToRef); |
讀取WeakRefs的值,使用deref()方法返回例項
// create an Instance const weakRefInstance = weakRefObj.deref(); console.log(weakRefInstance.age) // Output: 23 |
警告:由於垃圾收集器的複雜/不可預測性,不建議建立 WeakRef。垃圾收集何時、如何以及是否發生取決於任何給定 JavaScript 引擎的實現。在一個引擎中觀察到的任何行為都可能與另一個引擎不同。
Finalization Registry
Finalization 是在程式執行無法訪問的物件之後執行程式碼以進行清理。
用例:
與 WeakRef 一起引入的 Finalization Registry 用於管理在目標物件被垃圾收集時執行的清理操作的註冊和登出。清理回撥有時稱為終結器。
// create a registry
const registry = new FinalizationRegistry(heldValue => {
// Do something here
});
//您可以透過呼叫該register()方法、傳入物件和為其保留的值來註冊您想要清除回撥的任何物件: |
registry.register(theObject, "some value");
傳遞給register()方法的物件將是弱引用,因此當該值被垃圾收集時,第二個引數(“某個值”)將傳遞給終結器。
警告:就像 WeakRefs 一樣,FinalizationRegistry 應該避免使用,並且只有在仔細考慮後才能使用,原因與上述相同。
Promise.any()
Promise.any() 接受一個可迭代的承諾物件,並在可迭代物件中的一個承諾滿足時進行解析。這與舊的 promise.all() 不同,它在解決之前等待所有承諾解決。它在一個承諾完成後短路,所以一旦找到一個承諾,它就不會等待其他承諾完成。如果我們只需要兌現一個承諾,但我們不關心哪一個兌現,這可能是有益的。
// demonstrating promise.any() const firstPromise = new Promise((resolve) => setTimeout(resolve, 700, 'I am the first promise')); const secondPromise = new Promise((resolve) => setTimeout(resolve, 300, 'I am the second promise')); const thirdPromise = new Promise((resolve) => setTimeout(resolve, 1000, 'I am the third promise')); const allPromises = [firstPromise, secondPromise, thirdPromise]; Promise.any(allPromises) .then((value) => console.log(value)) // Output: "I am the second promise" |
AggregateError
AggregateError 物件表示將單個錯誤組合在一起的錯誤。當一個操作需要報告多個錯誤時丟擲。
用例:
以上面的promise.any()方法程式碼為例,如果所有的promise都拒絕了,就會丟擲一個聚合錯誤。
// demonstrating AggregateError const rejectedPromise = Promise.reject(new Error("an error")); Promise.any([rejectedPromise]) .catch(e => { console.log(e instanceof AggregateError); // Output: true console.log(e); // Output: AggregateError: All promises were rejected }); |
邏輯賦值運算子
這是邏輯運算(&&, || or ??)與賦值運算子(=)的組合。即||=, &&=, ??=。
用例:
邏輯 OR 賦值運算子x ||= y僅在 x 為假時賦值
// Logical OR assignment operator (||=) let myName = ''; let myGrade = 5; myName ||= 'Obi'; console.log(myName); // Output: "Obi" myGrade ||= 2; console.log(myGrade); // Output: 5 // Logical AND assignment (&&=) let a = 1; a &&= 3 // Output: a = 3 |
// Logical nullish assignment (??=) let a; let b = 50; a ??= b; console.log(a); //Output: 50 |
數字文字的分隔符
用例:
引入這些分隔符是為了使開發人員能夠透過在數字組之間建立視覺分隔來使數字文字更具可讀性。大數字文字很難在視覺上解析,特別是當有很長的數字重複時。
1000000000 // Is this a billion? a hundred million? Ten millions? 101475938.38 // what scale is this? what power of 10? |
常規數字文字:
let budget = 1_000_000_000_000; // What is the value of `budget`? It's 1 trillion! // // Let's confirm: console.log(budget === 10 ** 12); // true |
二進位制文字
let nibbles = 0b1010_0001_1000_0101; // Is bit 7 on? It sure is! // 0b1010_0001_1000_0101 // ^ // // We can double check: console.log(!!(nibbles & (1 << 7))); // true |
十六進位制文字:
// Messages are sent as 24 bit values, but should be // treated as 3 distinct bytes: let message = 0xA0_B0_C0; // What's the value of the upper most byte? It's A0, or 160. // We can confirm that: let a = (message >> 16) & 0xFF; console.log(a.toString(16), a); // a0, 160 // What's the value of the middle byte? It's B0, or 176. // Let's just make sure... let b = (message >> 8) & 0xFF; console.log(b.toString(16), b); // b0, 176 // What's the value of the lower most byte? It's C0, or 192. // Again, let's prove that: let c = message & 0xFF; console.log(c.toString(16), b); // c0, 192 |
相關文章
- ECMAScript 2021主要新功能 – thenewstack
- 遺留程式碼處理技巧與案例演示
- WebSocket 程式碼演示Web
- GraphQL案例演示
- ECMAScript 2021 正式確認
- 種草ECMAScript2021新特性
- InnoDB鎖衝突案例演示
- 2.2反射性xss案例演示反射
- nms 演算法演示(附程式碼)演算法
- NCF 的Azure Cosmos DB 演示案例
- CSS設定div邊框演示程式碼CSS
- kafka消費者提交方式(程式碼演示)Kafka
- Authing新功能——小程式掃碼登入
- ECMAScript 2021(ES12)新特性簡介
- SpringMVC入門案例 & 常用API使用演示SpringMVCAPI
- CSS滑鼠懸浮出現遮罩層程式碼演示CSS遮罩
- 簡單演示Excel中VBA程式碼的使用Excel
- 【.NET基礎】Linq常用語法程式碼演示
- Spring-1-AOP概念簡述-程式碼演示Spring
- YOLOv5 在最新 OpenVINO 2021R02 版本的部署與程式碼演示詳解YOLO
- 華登區塊狗現成系統軟體原始碼案例演示原始碼
- 高手 Linux 程式碼炫酷秀(含演示視訊)Linux
- 超詳細 | 使用Nexus搭建私服 (帶程式碼演示)
- NFT交易系統開發(APP案例演示)APP
- 現成雜湊遊戲系統原始碼搭建丨演示版案例遊戲原始碼
- 程式碼演示Mybatis-Generator 擴充套件自定義生成MyBatis套件
- 氣泡排序的演變過程及程式碼演示排序
- 交易所APP軟體開發(演示案例)APP
- api一鍵合約跟單帶單軟體開發案例演示(原始碼交付)API原始碼
- 快速掌握RabbitMQ(二)——四種Exchange介紹及程式碼演示MQ
- Golang 併發,有快取通道,通道同步案例演示Golang快取
- 業務程式碼程式設計陷阱案例 - jaxenter程式設計
- 二維陣列程式碼案例分析陣列
- LSD賽道流動性質押挖礦dapp系統開發|案例演示原始碼APP原始碼
- 量化現貨合約對沖交易軟體開發原始碼(案例演示)策略邏輯原始碼
- SpringBoot2 基礎案例(12):基於轉賬案例,演示事務管理操作Spring Boot
- API介面技術開發,接入商品評論api資料採集獲取好評詳情數量程式碼演示案例API
- 量化交易現貨合約對沖跟單app系統開發案例演示(原始碼搭建)APP原始碼