日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
ES12中新的JavaScript語言特性

JavaScript 語言規(guī)范,也稱為 ECMAScript 或 ES,是一個(gè)動(dòng)態(tài)文檔,每年都會(huì)根據(jù)不斷變化的需求進(jìn)行修改。雖然 JavaScript 最初是一種腳本語言,但 ECMAScript 規(guī)范概述指出,該語言“現(xiàn)在被用于許多不同環(huán)境和規(guī)模的全方位編程任務(wù)?!币虼耍琂avaScript 被更好地理解為一種功能齊全的通用用途的編程語言。

隨著即將發(fā)布的 ECMAScript 2022 版本即將發(fā)布,讓我們來看看 ECMAScript 2021 中引入的新 JavaScript 語言功能。

String.prototype.replaceAll

replaceAll() 方法將一個(gè)字符串或正則表達(dá)式(稱為模式)作為其第一個(gè)參數(shù)。第二個(gè)參數(shù)是模式的替換。給定第一個(gè)和第二個(gè)參數(shù),replaceAll() 返回一個(gè)新字符串,它將作為源字符串,其中模式的所有實(shí)例都被替換為替換。源字符串不受影響。

在 ECMAScript 2021 中,replaceAll() 與 ECMAScript 2020 的 matchAll() 一起改進(jìn)了 JavaScript 內(nèi)置 String 對(duì)象的固有功能。

replaceAll() 方法的工作方式與 replace() 完全相同,但適用于字符串中的所有匹配項(xiàng),而不僅僅是第一個(gè)匹配項(xiàng)。經(jīng)過多年不得不使用庫或手動(dòng)編碼的解決方案,這是一個(gè)受歡迎的補(bǔ)充。

在示例1中,我例舉了一個(gè)簡單的示例,其中我們修改了一些莎士比亞作品。

示例1、 replaceAll()

let quote = "all the world's a stage, and all the men and women merely players";
let newQuote = quote.replaceAll("all", "most of");
console.log(newQuote);

promise.any()  

promise.any() 方法接受一組承諾,并允許通過返回一個(gè)新的承諾來響應(yīng)第一個(gè)成功完成的promise。

如果任何promise被拒絕,它們將被忽略。(請(qǐng)注意此方法與 promise.all() 的對(duì)比,后者在任何錯(cuò)誤或拒絕時(shí)停止;與 promise.allSettled() 相比,它可以讓您觀察在集合中解決的所有promise,即使存在中間錯(cuò)誤。)

如果任何一個(gè) Promise 出錯(cuò),promise.any() 仍然會(huì)根據(jù)集合中的第一個(gè)已解決的 Promise 進(jìn)行操作。

如果傳入的 Promise 都沒有解析,則 promise.any() 方法返回一個(gè)被拒絕的 Promise。它返回的錯(cuò)誤是 AggregateError,它也是 ECMAScript 2021 引入的一種新錯(cuò)誤類型。AggregateError 表示遇到的所有錯(cuò)誤的摘要。

我們可以使用 promise.any() 將多個(gè) Promise 匯總為一個(gè)。該承諾將解決首先解決的集合,忽略錯(cuò)誤和拒絕。

下面有一個(gè)簡單的示例。

示例2、promise.any()——全部解決

接著,我們開始看示例3,其中所有的 Promise 最終都因?yàn)楸痪芙^而失敗。

const promise1 = new Promise((resolve, reject) => {
setTimeout(resolve, 1000, "1 second");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(resolve, 2000, "2 second");
});
let promises = [promise1, promise2];
Promise.any(promises).then((firstResolved) => {
console.log(firstResolved); // outputs “1 second”
})

示例3、promise.any()——全部被拒絕

在示例3 中,我們添加了一個(gè) catch 處理程序,它在兩個(gè) Promise 都被拒絕后觸發(fā)。請(qǐng)注意,AggregateError 是一個(gè)包含有關(guān)失敗承諾的信息的對(duì)象。

const promise1 = new Promise((resolve, reject) => {
setTimeout(reject, 1000, "1 second");
});
const promise2 = new Promise((resolve, reject) => {
setTimeout(reject, 2000, "2 second");
});
let promises = [promise1, promise2];
Promise.any(promises).then((firstResolved) => {
console.log(firstResolved);
}).catch((err) => { console.log("error: " + err) }) // outputs error: AggregateError: All promises were rejected

讓我們仔細(xì)看看 AggregateError,它是 ECMAScript 2021 中的另一個(gè)新特性。

AggregateError  

AggregateError 是一種特殊的錯(cuò)誤子類,它將許多錯(cuò)誤組合成一個(gè)匯總對(duì)象。如您所見,特性 3 中的 promise.any() 方法創(chuàng)建了一個(gè) AggregateError。

在該示例中,傳遞給 promise.any() 的所有promise都失敗了,因此該方法返回了 AggregateError。錯(cuò)誤包含描述錯(cuò)誤的消息和包含有關(guān)每個(gè)錯(cuò)誤的詳細(xì)信息的數(shù)組。  

但是在示例4 顯示了返回的錯(cuò)誤內(nèi)容。

示例4、 AggregateError

如上所示,AggregateError 可以通過 AggregateError.errors 訪問導(dǎo)致錯(cuò)誤的承諾消息。

AggregateError: All promises were rejected
errors: Array(2)
0: "1 second"
1: "2 second"
length: 2
message: "All promises were rejected"
stack: "AggregateError: All promises were rejected"

新的邏輯賦值運(yùn)算符

JavaScript 有熟悉的數(shù)學(xué)賦值運(yùn)算符,例如 +=,它可以一次性執(zhí)行運(yùn)算和賦值,作為一種方便。ECMAScript 2021 為邏輯運(yùn)算符 ||、?? 和 && 添加了類似的支持。

讓我們來看看其中的每一個(gè)。

空賦值 (??=)

我們可以使用 nullish 賦值運(yùn)算符來測試變量是否為 null 或undefined。如果變量為 null 或undefined,我們可以將表達(dá)式的右側(cè)分配給變量。  

接著,我們繼續(xù)看示例5中的一個(gè)示例。

示例5、 ??= 實(shí)際賦值

請(qǐng)注意,當(dāng)用于存在的變量時(shí),例如 existingQuote,nullish 賦值運(yùn)算符什么也不做。但是,當(dāng)在 nonExistingQuote 上使用時(shí),它會(huì)為報(bào)價(jià)分配一個(gè)新值。

let quote = "When goodness is lost there is morality.";
let existingQuote = "A leader is best when people barely know he exists";
let nonExistingQuote = null;
existingQuote ??= quote;
nonExistingQuote ??= quote;
console.log(existingQuote); // A leader is best when people barely know he exists
console.log(nonExistingQuote); // When goodness is lost there is morality.

即使existingQuote 的字符串為空(在JavaScript 中是一個(gè)假值),nullish 賦值也不會(huì)替換它;它將保持為空字符串。這就是運(yùn)算符的本質(zhì):它只測試 null 或 undefined。

和賦值 (&&=)

和賦值運(yùn)算符 (&&=) 測試表達(dá)式的左側(cè)。如果左側(cè)為真,則分配表達(dá)式的右側(cè)。如果它是假的,則操作員什么也不做。  

下面我們看特性6中的一個(gè)簡單的示例。

示例6、賦值運(yùn)算符 ( &&=)

和賦值運(yùn)算符 ( &&=)用于表達(dá)式的左側(cè)。如果左側(cè)不為null或undefined,則分配表達(dá)式的右側(cè)。如果它是假的,則什么也不做。

let emptyString = "";
emptyString &&= "bar";
console.log (emptyString); // “”
let nonEmptyString = "foo";
nonEmptyString &&= "bar";
console.log(nonEmptyString); // “bar”

在特性6 中,第一個(gè)控制臺(tái)日志輸出一個(gè)空字符串。這是因?yàn)榭兆址翘摷俚模虼?&&= 運(yùn)算符不會(huì)為其分配新值。第二個(gè)控制臺(tái)輸出“bar”。這是因?yàn)?nonEmptyString 是“foo”,這是一個(gè)真值。

&&= 是一種邊緣情況運(yùn)算符,但在您需要時(shí)很有用。

或賦值 (||=)

or 賦值運(yùn)算符與您剛剛看到的 and 賦值運(yùn)算符相反。我們可以使用清單 6 中的相同示例,這次將 &&= 替換為 ||=。

示例 7、||= 實(shí)際賦值

let emptyString = "";
emptyString ||= "bar";
console.log (emptyString); // “bar”
let nonEmptyString = "foo";
nonEmptyString ||= "bar";
console.log(nonEmptyString); // “foo”

如果表達(dá)式的左側(cè)是假的,||= 賦值運(yùn)算符解析到右側(cè)。因此,在這種情況下,emptyString 變?yōu)椤癰ar”。nonEmptyString 變量保持其真實(shí)值“foo”。

WeakRef  

WeakRef 用于引用目標(biāo)對(duì)象,而不會(huì)將其從垃圾收集中保存。這是一個(gè)相當(dāng)深?yuàn)W的語言功能,工作編碼人員很少使用。WeakRef 的一個(gè)常見用例是實(shí)現(xiàn)大對(duì)象的緩存或映射,“不希望大對(duì)象僅僅因?yàn)樗霈F(xiàn)在緩存或映射中而保持活動(dòng)狀態(tài)?!?/p>

因此,如果發(fā)現(xiàn)自己正在為大型實(shí)體構(gòu)建緩存解決方案,請(qǐng)記住 WeakRef 存在。否則,如果不確定是否需要 WeakRef 變量引用,應(yīng)該避免使用它。(規(guī)范本身建議避免使用。)

FinalizationRegistry

JavaScript 幾乎與 Java 棄用 Object.finalize() 幾乎同時(shí)引入了 FinalizationRegistry,這有點(diǎn)編程諷刺。這些特征實(shí)際上是相似的。與 WeakRef 一樣,規(guī)范警告開發(fā)人員遠(yuǎn)離用戶定義的終結(jié)器。

但是,對(duì)于某些用例,新的 FinalizationRegistry 可能正是我們所需要的。該規(guī)范提供了消耗許多文件句柄的長時(shí)間運(yùn)行進(jìn)程的示例。在這種情況下,使用 FinalizationRegistry 可以確保沒有句柄被泄露。

與 WeakRef 一起,F(xiàn)inalizationRegistry 更適合平臺(tái)和框架開發(fā)人員的工具箱,而不是應(yīng)用程序開發(fā)人員。

Numeric literal separators

數(shù)字分隔符是一種很好的方式,可以讓我們更輕松地查看大量數(shù)字。JavaScript 不能像自然語言那樣使用逗號(hào),因?yàn)槟莻€(gè)符號(hào)已經(jīng)被占用了。因此,ECMAScript 2021 引入了下劃線。

第一輸入方式:

let distanceToSun = 91772000000;

第二種輸入方式:

let distanceToSun = 91_772_000_000;

但是第二種方式更容易閱讀。

Array.prototype.sort improvements

這更像是一個(gè)注釋而不是一個(gè)功能?;旧?,ECMAScript 2021 規(guī)范更準(zhǔn)確地描述了 Array.prototype.sort 的工作原理。這種變化應(yīng)該會(huì)減少引擎之間實(shí)現(xiàn)的差異。

寫在最后

以上就是全部內(nèi)容,如果你覺得有用的話,記得點(diǎn)贊我,關(guān)注我,我將與你分享更多有用的內(nèi)容。

祝編程愉快!


網(wǎng)頁名稱:ES12中新的JavaScript語言特性
網(wǎng)頁鏈接:http://www.5511xx.com/article/cooedgo.html