JavaScript ES2021 最值得期待的 5 個新特性解析

大家好,我是若川。歡迎加我微信?ruochuan12,長期交流學習。今天分享一篇關于ES2021的5個新特性。點擊下方卡片關注我,或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列


在寫本文時,本文提到的新的 JavaScript 提案功能已進入第 4 階段,并且幾乎肯定會包含在 ES2021 中。你已經可以開始在 最新版本的瀏覽器,Node.js 和 Babel 中使用。

注意:ECMAScript 是 JavaScript 所基于的標準,由 TC39 委員會管理。ECMAScript 始終是一個不需要的名稱,這會使一切都對初學者感到困惑。人們經常談論 JavaScript 功能,但參考的是 ECMAScript 規范。

更新特性

  • 數字分隔符(_

  • 邏輯分配(&&=||=??=

  • 引用不足(WeakRefFinalizationRegistry

  • Promise.any

  • String.prototype.replaceAll

1. 數值分隔符

大數字文字很難使人眼快速解析,尤其是當有很多重復的數字時:

1000000000000???1019436871.42

為了提高可讀性,新的 JavaScript 語言功能 啟用了下劃線作為數字文字中的分隔符。因此,上面的內容現在可以重寫為每千位數字,例如:

1_000_000_000_000????1_019_436_871.42

現在,更容易說出第一個數字是 1 萬億,而第二個數字大約是 10 億。

數字分隔符有助于提高各種數字文字的可讀性:

//?A?decimal?integer?literal?with?its?digits?grouped?per?thousand:
1_000_000_000_000
//?A?decimal?literal?with?its?digits?grouped?per?thousand:
1_000_000.220_720
//?A?binary?integer?literal?with?its?bits?grouped?per?octet:
0b01010110_00111000
//?A?binary?integer?literal?with?its?bits?grouped?per?nibble:
0b0101_0110_0011_1000
//?A?hexadecimal?integer?literal?with?its?digits?grouped?by?byte:
0x40_76_38_6A_73
//?A?BigInt?literal?with?its?digits?grouped?per?thousand:
4_642_473_943_484_686_707n

它們甚至適用于八進制整數文字(盡管 我想不出 其中分隔符為此類文字提供值 的示例):

//?A?numeric?separator?in?an?octal?integer?literal:??????♀?
0o123_456

請注意,JavaScript 還具有不帶顯式 0o 前綴的八進制文字的舊式語法。例如,017 === 0o17。在嚴格模式下或模塊內不支持此語法,并且在現代代碼中不應使用此語法。因此,這些文字不支持數字分隔符。使用 0o17 風格的文字代替。

2. Promise combinators

自從 ES2015 中引入 Promise 以來,JavaScript 完全支持兩種 Promise 組合器:靜態方法 Promise.all 和 Promise.race。

目前有兩個新提案正在通過標準化流程:Promise.allSettled 和 Promise.any。有了這些添加,JavaScript 中將總共有四個諾言組合器,每個組合器支持不同的用例。

以下是這四個組合器的概述:

2.1 Promise.allSettled

Promise.allSettled 給你當所有輸入的諾言是一種信號結算,這意味著他們要么履行或拒絕。如果您不在乎承諾的狀態,而只是想知道工作何時完成,無論它是否成功,這都是很有用的。

例如,您可以啟動一系列獨立的 API 調用,并使用 Promise.allSettled 它們來確保它們已全部完成,然后再執行其他操作,例如刪除加載微調器:

const?promises?=?[fetch('/api-call-1'),fetch('/api-call-2'),fetch('/api-call-3'),
];
//?Imagine?some?of?these?requests?fail,?and?some?succeed.await?Promise.allSettled(promises);
//?All?API?calls?have?finished?(either?failed?or?succeeded).
removeLoadingIndicator();

2.2 Promise.any

Promise.any 方法和 Promise.race 類似——只要給定的迭代中的一個 promise 成功,就采用第一個 promise 的值作為它的返回值,但與 Promise.race 的不同之處在于——它會等到所有 promise 都失敗之后,才返回失敗的值:

const?promises?=?[fetch('/endpoint-a').then(()?=>?'a'),fetch('/endpoint-b').then(()?=>?'b'),fetch('/endpoint-c').then(()?=>?'c'),
];
try?{const?first?=?await?Promise.any(promises);//?Any?of?the?promises?was?fulfilled.console.log(first);//?→?e.g.?'b'
}?catch?(error)?{//?All?of?the?promises?were?rejected.console.assert(error?instanceof?AggregateError);//?Log?the?rejection?values:console.log(error.errors);//?→?[//?????<TypeError:?Failed?to?fetch?/endpoint-a>,//?????<TypeError:?Failed?to?fetch?/endpoint-b>,//?????<TypeError:?Failed?to?fetch?/endpoint-c>//???]
}

此代碼示例檢查哪個端點響應最快,然后將其記錄下來。只有當 所有 請求都失敗時,我們才最終進入代碼 catch 塊,然后在其中處理錯誤。

Promise.any 拒絕可以一次代表多個錯誤。為了在語言級別支持此功能,引入了一種新的錯誤類型,稱為 AggregateError。除了上面示例中的基本用法外,還可以以編程方式構造 AggregateError 對象,就像其他錯誤類型一樣:

const?aggregateError?=?new?AggregateError([errorA,?errorB,?errorC],?'Stuff?went?wrong!');

3. Weak references and finalizers

此功能包含兩個高級對象 WeakRefFinalizationRegistry。根據使用情況,這些接口可以單獨使用,也可以一起使用。正確使用它們需要仔細考慮,如果可能,最好避免使用它們。

一般來說,在JavaScript中,對象的引用是強保留的,這意味著只要持有對象的引用,它就不會被垃圾回收。

const?ref?=?{?x:?42,?y:?51?};
//?只要我們訪問?ref?對象(或者任何其他引用指向該對象),這個對象就不會被垃圾回收

目前在 Javascript 中,WeakMap 和 WeakSet 是弱引用對象的唯一方法:將對象作為鍵添加到 WeakMap 或 WeakSet 中,是不會阻止它被垃圾回收的。

JavaScript 的 WeakMap 并不是真正意義上的弱引用:實際上,只要鍵仍然存活,它就強引用其內容。WeakMap 僅在鍵被垃圾回收之后,才弱引用它的內容。

WeakRef 是一個更高級的 API,它提供了真正的弱引用,Weakref 實例具有一個方法 deref,該方法返回被引用的原始對象,如果原始對象已被收集,則返回 undefined 對象。

JavaScript 中對象的引用是強引用,WeakMap 和 WeakSet 可以提供部分的弱引用功能,若想在 JavaScript 中實現真正的弱引用,可以通過配合使用 WeakRef 和終結器(Finalizer)來實現。

WeakRef 是用來指目標對象不脫離垃圾收集保留它的對象。如果未通過垃圾回收回收目標對象,則 WeakRefs 可以取消引用以允許訪問目標對象。

//?Create?a?WeakRef?object?referring?to?a?given?target?object
const?ref?=?new?WeakRef(targetObject)//?Return?the?WeakRef?instance's?target?object,?or?undefined?if?the?target?object?has?been?garbage-collected
const?obj?=?ref.deref()

使用 FinalizationRegistry 對象可以在垃圾回收對象時請求回調。

//?Create?a?registry?object?that?uses?the?given?callback
const?registry?=?new?FinalizationRegistry([callback])//?Register?an?object?with?a?registry?instance?so?that?if?the?object?is?garbage-collected,?the?registry's?callback?may?get?called
registry.register(target,?heldValue,?[unregisterToken])//?Unregister?a?target?object?from?a?registry?instance
registry.unregister(unregisterToken)

更多信息:TC39提案,V8

4. String.prototype.replaceAll

當前,如果不使用全局正則表達式,就無法替換字符串中子字符串的所有實例。與字符串參數一起使用時,String.prototype.replace 僅影響首次出現。

String.prototype.replaceAll()?將為開發人員提供一種簡單的方法來完成此常見的基本操作。

'aabbcc'.replaceAll('b',?'.')?//?'aa..cc'
'aabbcc'.replaceAll(/b/g,?'.')?//?'aa..cc'

5. Logical assignment (邏輯分配)

支持與新的運營邏輯分配 &&=||=??=。與它們的 數學和按位對應物不同,邏輯分配遵循其各自邏輯操作的短路行為。僅當邏輯運算將評估右側時,它們才執行分配。

//?falsy:?false,?0,?-0,?0n,?"",?null,?undefined,?and?NaN
//?truthy:?all?values?are?truthy?unless?defined?as?falsy
//?nullish:?null?or?undefineda?||=?b
//?Logical?OR?assignment
//?Equivalent?to:?a?||?(a?=?b);
//?Only?assigns?if?a?is?falsya?&&=?b
//?Logical?AND?assignment
//?Equivalent?to:?a?&&?(a?=?b);
//?Only?assigns?if?a?is?truthya???=?b
//?Logical?nullish?assignment
//?Equivalent?to:?a????(a?=?b);
//?Only?assigns?if?a?is?nullish

5.1 具體例子

帶有 && 運算符的邏輯賦值運算符

僅當 LHS 值為真時,才將 RHS 變量值賦給 LHS 變量。

//?Logical?Assignment?Operator?with?&&?operator
let?num1?=?5
let?num2?=?10
num1?&&=?num2
console.log(num1)?//?10
//?Line?5?can?also?be?written?as?following?ways
//?1.?num1?&&?(num1?=?num2)
//?2.?if?(num1)?num1?=?num2

帶有 || 的運算符邏輯賦值運算符

僅當 LHS 值為假時,才將 RHS 變量值賦給 LHS 變量。

//?Logical?Assignment?Operator?with?||?operator
let?num1
let?num2?=?10
num1?||=?num2
console.log(num1)?//?10
//?Line?5?can?also?be?written?as?following?ways
//?1.?num1?||?(num1?=?num2)
//?2.?if?(!num1)?num1?=?num2

帶有 ?? 運算符的邏輯賦值運算符

ES2020 引入了空值合并運算符,其也可以與賦值運算符結合使用。僅當 LHS 為 undefined 或僅為 null 時,才將 RHS 變量值賦給 LHS 變量。

//?Logical?Assignment?Operator?with????operator
let?num1
let?num2?=?10
num1???=?num2
console.log(num1)?//?10
num1?=?false
num1???=?num2
console.log(num1)?//?false
//?Line?5?can?also?be?written?as?following?ways
//?num1????(num1?=?num2)

概括

作為開發人員,跟緊語言的新特性是很重要的。

以上將在 2021 年發布的一些新功能,它們是進入第 4 階段的提案,幾乎可以肯定會包括在內,這些功能已經在最新的瀏覽器和 babel 中實現。

參考文章:JavaScript Features in 2021

最近組建了一個江西人的前端交流群,如果你也是江西人可以加我微信 ruochuan12 拉你進群。



·················?若川出品?·················

今日話題

今天分享一個chrome瀏覽器標簽預覽功能,打開chrome://flags,搜索tab hover Card Images,改成Enabled就開啟啦,快試試吧。歡迎分享、收藏、點贊、在看我的公眾號文章~

一個愿景是幫助5年內前端人走向前列的公眾號

可加我個人微信 ruochuan12,長期交流學習

推薦閱讀

我在阿里招前端,我該怎么幫你?(現在還能加我進模擬面試群)

如何拿下阿里巴巴 P6 的前端 Offer

點擊方卡片關注我,或者查看源碼等系列文章。
學習源碼整體架構系列、年度總結、JS基礎系列

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/276005.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/276005.shtml
英文地址,請注明出處:http://en.pswp.cn/news/276005.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

uniapp延遲執行_uniapp微信小程序真機調試點擊按鈕有1秒延遲

詳細問題描述(DCloud產品不會有明顯的bug&#xff0c;所以你遇到的問題大都是在特定環境下才能重現的問題&#xff0c;請仔細描述你的環境和重現方式&#xff0c;否則DCloud很難排查解決你的問題)[內容]開發uniapp小程序項目時,在頁面中點擊按鈕后, 數據即時更新, 視圖層延遲1秒…

latex排版基礎_排版基礎分類

latex排版基礎重點 (Top highlight)There are many parts to creating a beautiful, functional, memorizing design. That’s what all User Experience designers set out to do. You need to consider your users, strategy, features, content, color, and so much more. A…

AS3 CookBook學習整理(一)

1. 我要改變swf的尺寸和顏色 在flex builder 3里&#xff0c;默認會生成一個全屏、背景色為#869CA7、幀數為24/秒的swf文件&#xff0c;要修改這些參數&#xff0c;只需要在類文件中定義 [SWF(width"800", height"600", backgroundColor"#ffffff"…

微信小程序研發問題梳理:翻頁:下拉:緩存:canvas:富文本:分享

微信小程序研發問題梳理 最近鼓搗小程序的時候&#xff0c;著實遇到了一些問題&#xff0c;盡管有些再翻看文檔幾遍&#xff0c;就能找到答案&#xff0c;但還是要發揮下爛筆頭的功效&#xff0c;順便梳理下。 問題列表 登錄流程小程序標簽頁地址無法跳轉問題頁面翻頁內容加…

Nginx重啟方式

2019獨角獸企業重金招聘Python工程師標準>>> 重啟方式有三種&#xff1a; 1.簡單型&#xff0c;先關閉進程&#xff0c;修改你的配置后&#xff0c;重啟進程。 2.重新加載配置文件&#xff0c;不重啟進程&#xff0c;不會停止處理請求 3.平滑更新nginx二進制&#x…

axure如何頁面滑動時廣告位上移_新手APP運營如何做廣告位投放

運營是什么&#xff1f;這種問題在各種論壇、貼吧、百度知道、問答百科類中都會出現。上面也有各種大神各式各樣的回答&#xff0c;從不同角度向我們闡述了什么是運營。用 戶運營、內容運營、社區運營、活動運營、市場運營、等等&#xff0c;各種各樣的文章對它們有非常多的分類…

常見的8個前端防御性編程方案

大家好&#xff0c;我是若川。歡迎加我微信 ruochuan12&#xff0c;長期交流學習。今天分享幾個常見的前端防御性編程方案。點擊下方卡片關注我&#xff0c;或者查看源碼等系列文章。學習源碼整體架構系列、年度總結、JS基礎系列關于前端防御性編程我們大多數情況可能遇到過&am…

比特平面分層_平面設計中的分層

比特平面分層One of the first windows to pop up automatically, when I first started using Adobe Photoshop back in 2013, was the Layers one. Albeit I was dabbling around with it for making memes, it was one of the first things I played around with.2013年&…

微軟中國推校園先鋒計劃,保障學生低價獲取正版軟件

2010年7月13日&#xff0c;人人網 Lucky 7 率先向同學們宣布了"微軟校園先鋒計劃"上線的消息&#xff0c;該計劃現在接受學生預購正版 Windows 7 專業版和 Office 2010 專業版&#xff0c;正式銷售的日期為7月19日。該計劃的官網是&#xff1a;http://ms.shop.edu.cn…

Nginx laraval-admin 頁面小圖標不顯示 問題處理

laraval-admin 頁面小圖標不顯示 類似問題 nginx下加載eot|otf|ttf|woff|svg等404 錯誤問題 瀏覽器console控制臺報錯 GET http://admin.xxx.com/vendor/laravel-admin/google-fonts/fonts/Source-Sans-Pro.woff2 net::ERR_ABORTED 404 (Not Found)CSS 樣式引用字體 font-face …

Ajax完整資料加代碼

什么是Ajax&#xff1f;答&#xff1a;Ajax是一種無需加載整個網頁&#xff0c;就能夠更新部分網頁&#xff0c;與后臺交互的技術。Ajax的優點&#xff1f;答&#xff1a;能夠在不更新整個頁面的前提下&#xff0c;維護數據。這使得Web程序可以更快速的回應用戶的動作&#xff…

did雙重差分法_Stata中雙重差分操流程及代碼

01簡介現代計量經濟學和統計學的發展為我們的研究提供了可行的工具。倍差法來源于計量經濟學的綜列數據模型&#xff0c;是政策分析和工程評估中廣為使用的一種計量經濟方法。主要是應用于在混合截面數據集中&#xff0c;評價某一事件或政策的影響程度。該方法的基本思路是將調…

Axios 如何緩存請求數據?

大家好&#xff0c;我是若川。歡迎加我微信 ruochuan12&#xff0c;長期交流學習。今天推薦這篇Axios緩存請求數據的文章&#xff0c;相信是常見的業務場景&#xff0c;感興趣的讀者可以看看 umi-request&#xff0c;支持緩存功能。另外我之前也寫過 axios源碼文章&#xff0c;…

Reflection in .net

最近在看設計模式的一些東西&#xff0c;在講到builder模式中使用到了c#的反射機制&#xff0c;從網上找了寫資料&#xff0c;整理如下&#xff1a; 在C#中&#xff0c;我們要使用反射&#xff0c;首先要搞清楚以下命名空間中幾個類的關系: System.Reflection命名空間(1) App…

山西萬榮盛裝迎新春 首屆群眾文化藝術節啟幕

山西萬榮盛裝迎新春&#xff0c;首屆群眾文化藝術節啟幕。 李繼旺 攝 山西萬榮盛裝迎新春&#xff0c;首屆群眾文化藝術節啟幕。 李繼旺 攝 中新網太原1月29日電 (任麗娜)璀璨閃耀的寶鼎廣場花燈展、激情活力的群眾文體賽事、精彩紛呈的紅火熱鬧、精品年貨展銷、李家大院游園會…

MySQL 隱式轉換 字符串和整型說明

MySQL 隱式轉換 字段類型定義 CREATE TABLE user (id int(10) NOT NULL AUTO_INCREMENT COMMENT 編號,/* ...... */name varchar(10) NOT NULL DEFAULT COMMENT 姓名,/* ...... */PRIMARY KEY (id),KEY idx_name (name,nickname),/* ...... */ ) ENGINEInnoDB DEFAULT CHARSE…

安裝vs2017出現閃退現象_Adobe Reader 閃退

在我們的日常辦公、學習中經常會涉及到 PDF 文件&#xff0c;免不了需要處理 PDF 文件如&#xff1a;PDF轉Word、PDF合并、導出成圖片、PDF解密、PDF轉PPT、PDF加水印、PDF簽名等等。PDF是與平臺無關的文件格式&#xff0c;無論在哪種打印機上都可保證精確的顏色和準確的打印效…

從Vue.js源碼中我學到的幾個實用函數

大家好&#xff0c;我是若川。歡迎加我微信 ruochuan12&#xff0c;長期交流學習。今天推薦Vuejs源碼中幾個實用的方法。如果想看Vuejs源碼&#xff0c;不知道如何下手&#xff0c;一般推薦配置Sourcemap&#xff0c;針對單個問題調試來看&#xff0c;如何調試Vuejs源碼&#x…

real類型_如何使用REAL方法對您的Web內容進行現實檢查

real類型Web內容審核模板 (Web content audit template) I recently completed a website audit project for a nonprofit organization through CatchAFire.org. As part of the website audit, I audited every key page’s content, looking for areas of opportunity.我最近…

青海行--(7月26日)翻越祁連山

嘉峪關是最值得一寫的&#xff0c;雖然也是著名的旅游城嘉峪關景點是國家&#xff21;&#xff21;&#xff21;&#xff21;&#xff21;級景區&#xff0c;但與敦煌完全不一樣&#xff0c;沒有人山人海的游客&#xff0c;門票也不貴&#xff0c;才&#xff11;&#xff10;&a…