ES6(ECMAScript 2015)
ES6 正式支持了類、模塊、迭代器、生成器、箭頭函數(shù)、Promise、反射、代理和眾多新的數(shù)據(jù)類型
- let 和 const
- 解構(gòu)賦值
- 模板字符串
- 函數(shù)參數(shù)默認(rèn)值和箭頭函數(shù)
- 擴(kuò)展運(yùn)算符
- 對(duì)象的屬性簡(jiǎn)寫
- super 關(guān)鍵字
- Symbol 變量
- Set 和 Map 數(shù)據(jù)
- 代理和反射
- 迭代器
- Promise
- class 類
- Module 模塊
ES7(ECMAScript 2016)
ECMAScript 2016 中添加了以下功能:
-
Array.prototype.includes()檢查數(shù)組是否包含給定值。 -
求冪運(yùn)算符 (**):4 ** 2 => 16
es8(ECMAScript 2017)
ECMAScript 2017 中添加了以下功能:
-
異步函數(shù)(async/await)讓我們使用看起來(lái)像同步的語(yǔ)法來(lái)編寫異步代碼。 -
Object.values()返回一個(gè)數(shù)組,其中包含給定對(duì)象的所有可枚舉字符串鍵屬性的值。 -
Object.entries()返回一個(gè)數(shù)組,其中包含給定對(duì)象的所有可枚舉字符串鍵屬性的鍵值對(duì)。每對(duì)都被編碼為一個(gè)二元素?cái)?shù)組。 -
字符串填充:字符串方法String.padStart()和String.padEnd()插入填充文本,直到接收者足夠長(zhǎng):'7'.padStart(3, '0'); // '007' 'yes'.padEnd(6, '!'); // 'yes!!!' -
函數(shù)參數(shù)列表和調(diào)用中的尾隨逗號(hào):自 ES3 以來(lái),數(shù)組文字和自 ES5 以來(lái)的對(duì)象文字中都允許使用尾隨逗號(hào)。它們現(xiàn)在也允許在函數(shù)調(diào)用和方法調(diào)用中使用。 Object.getOwnPropertyDescriptors()-
共享內(nèi)存和原子(見提案)
ES9(ECMAScript 2018)
ECMAScript 2018 中添加了以下功能:
-
異步迭代是同步迭代的異步版本。它基于 Promise:- 使用同步迭代,我們可以立即訪問每個(gè)項(xiàng)目。使用異步迭代,我們必須 await 在訪問項(xiàng)目之前。
- 對(duì)于同步迭代,我們使用 for-of 循環(huán)。對(duì)于異步迭代,我們使用 for-await-of 循環(huán)。
-
傳播到對(duì)象文字中:通過在對(duì)象文字中使用傳播(...),我們可以將另一個(gè)對(duì)象的屬性復(fù)制到當(dāng)前對(duì)象中。一個(gè)用例是創(chuàng)建對(duì)象的淺拷貝obj:const shallowCopy = {...obj}; -
解構(gòu)屬性:當(dāng)對(duì)象解構(gòu)一個(gè)值時(shí),我們現(xiàn)在可以使用解構(gòu)語(yǔ)法(...)來(lái)獲取一個(gè)對(duì)象中所有以前未提及的屬性。const {a, ...remaining} = {a: 1, b: 2, c: 3}; assert.deepEqual(remaining, {b: 2, c: 3}); -
Promise.prototype.finally()與 finally try-catch-finally 語(yǔ)句的子句相關(guān)——類似于 Promise 方法如何.then() 與 try 子句 .catch() 相關(guān)并與 catch 子句相關(guān)。
換句話說:.finally() 無(wú)論 Promise 是否被履行或拒絕,都會(huì)執(zhí)行回調(diào)。 新的正則表達(dá)式功能-
模板文字修訂允許在標(biāo)記模板中帶有反斜杠的文本在字符串文字中是非法的
ES10(ECMAScript 2019)
ECMAScript 2019 中添加了以下功能:
-
Array.prototype.flatMap()工作方式類似.map(),但讓回調(diào)返回零個(gè)或多個(gè)值的數(shù)組,而不是單個(gè)值。然后將返回的數(shù)組連接起來(lái)并成為 .flatMap() 用例包括:- 同時(shí)過濾和映射
- 將單個(gè)輸入值映射到多個(gè)輸出值
-
Array.prototype.flat()將嵌套數(shù)組轉(zhuǎn)換為平面數(shù)組?;蛘?,我們可以告訴它應(yīng)該在哪個(gè)嵌套深度停止展平。 -
Object.fromEntries()從可迭代的條目創(chuàng)建一個(gè)對(duì)象。每個(gè)條目都是一個(gè)包含屬性鍵和屬性值的二元素?cái)?shù)組。 -
字符串方法:.trimStart()工作方式.trimEnd()類似.trim(),但僅在字符串的開頭或結(jié)尾刪除空格。 -
可選catch:如果我們不使用它,我們現(xiàn)在可以省略子句的參數(shù)。 -
Symbol.prototype.description是讀取符號(hào)的描述。以前,描述包含在結(jié)果中,.toString() 但無(wú)法單獨(dú)訪問。 JSON 超集格式良好JSON.stringify()Function.prototype.toString()修訂
ES11(ECMAScript 2020)
ECMAScript 2020 中添加了以下功能:
-
新模塊功能:- 動(dòng)態(tài)導(dǎo)入 import():正常的 import 語(yǔ)句是靜態(tài)的:我們只能在模塊的頂層使用它,它的模塊說明符是一個(gè)固定的字符串。import() 改變了這一點(diǎn)。它可以在任何地方使用(包括條件語(yǔ)句),我們可以計(jì)算它的參數(shù)。
- import.meta 包含當(dāng)前模塊的元數(shù)據(jù)。它的第一個(gè)廣泛支持的屬性是 import.meta.url 包含一個(gè)帶有當(dāng)前模塊文件 URL 的字符串。
- 命名空間重新導(dǎo)出:以下表達(dá)式導(dǎo)入'mod'命名空間對(duì)象中模塊的所有導(dǎo)出ns并導(dǎo)出該對(duì)象。
`export * as ns from 'mod';`
-
屬性訪問和方法調(diào)用的可選鏈接。可選鏈接的一個(gè)示例是:`value.?prop`此表達(dá)式的計(jì)算結(jié)果為 undefined。否則,它的計(jì)算結(jié)果為value.prop。當(dāng)某些屬性可能丟失時(shí),此功能在屬性讀取鏈中特別有用。
-
空值合并運(yùn)算符 (??):value ?? defaultValue該運(yùn)算符允許我們?cè)谌鄙倌承﹥?nèi)容時(shí)使用默認(rèn)值。
以前在這種情況下使用了邏輯或運(yùn)算符 (||),但它在這里有缺點(diǎn),因?yàn)橹灰髠?cè)是假的(這并不總是正確的),它就會(huì)返回默認(rèn)值。 Bigints – 任意精度整數(shù):Bigints 是一種新的原始類型。它支持可以任意大的整數(shù)(它們的存儲(chǔ)會(huì)根據(jù)需要增長(zhǎng))。String.prototype.matchAll()/g:如果未設(shè)置標(biāo)志,則此方法拋出,并返回一個(gè)包含給定字符串的所有匹配對(duì)象的可迭代對(duì)象。-
Promise.allSettled()接收一個(gè)可迭代的 Promises。它返回一個(gè) Promise,一旦所有輸入的 Promise 都被解決,該 Promise 就會(huì)實(shí)現(xiàn)。實(shí)現(xiàn)值是一個(gè)數(shù)組,每個(gè)輸入 Promise 有一個(gè)對(duì)象——以下之一:- { status: 'fulfilled', value: ?fulfillment value? }
- { status: 'rejected', reason: ?rejection value? }
globalThis提供了一種訪問全局對(duì)象的方法,該對(duì)象可在瀏覽器和服務(wù)器端平臺(tái)(如 Node.js 和 Deno)上運(yùn)行。for-in: 在 JavaScript 中部分指定對(duì)象枚舉順序
ES12(ECMAScript 2021)
ECMAScript 2021 中添加了以下功能:
-
String.prototype.replaceAll()讓我們替換正則表達(dá)式或字符串的所有匹配項(xiàng)(.replace()僅替換第一次出現(xiàn)的字符串):'abbbaab'.replaceAll('b', 'x'); // 'axxxaax' -
Promise.any() 和 AggregateError:Promise.any() 返回一個(gè) Promise,一旦 Promise 的可迭代中的第一個(gè) Promise 完成,它就會(huì)完成。如果只有拒絕,則將它們放入 AggregateError 成為拒絕值的其中。
Promise.any() 只對(duì)幾個(gè)中第一個(gè)實(shí)現(xiàn)的 Promise 感興趣時(shí)使用。 -
邏輯賦值運(yùn)算符:a ||= b; a &&= b; a ??= b; -
下劃線 ( _) 作為分隔符:- 數(shù)字文字:123_456.789_012
- Bigint 字面量:6_000_000_000_000_000_000_000_000n
WeakRefs
ES13(ECMAScript 2022)
ES2022 可能會(huì)在 2022 年 6 月成為標(biāo)準(zhǔn)。以下提案已進(jìn)入第 4 階段,并計(jì)劃成為該標(biāo)準(zhǔn)的一部分:
-
班級(jí)新成員:- 現(xiàn)在可以通過以下方式創(chuàng)建屬性(公共插槽):
- 實(shí)例公共字段
- 靜態(tài)公共字段
- 私有插槽是新的,可以通過以下方式創(chuàng)建:
- 私有字段(實(shí)例私有字段和靜態(tài)私有字段)
- 私有方法和訪問器(非靜態(tài)和靜態(tài))
- 靜態(tài)初始化塊
- 現(xiàn)在可以通過以下方式創(chuàng)建屬性(公共插槽):
-
私有插槽檢查:以下表達(dá)式檢查是否obj有私有插槽#privateSlot:#privateSlot in obj -
模塊中的頂層 await:我們現(xiàn)在可以在模塊 await 的頂層使用,而不必再輸入異步函數(shù)或方法。 -
error.cause:Error 及其子類現(xiàn)在讓我們指定哪個(gè)錯(cuò)誤導(dǎo)致了當(dāng)前錯(cuò)誤:new Error('Something went wrong', {cause: otherError}); -
.at()可索引值的方法讓我們可以讀取給定索引處的元素(如括號(hào)運(yùn)算符[])并支持負(fù)索引(與括號(hào)運(yùn)算符不同)。
以下“可索引”類型具有方法.at():['a', 'b', 'c'].at(0); // 'a' ['a', 'b', 'c'].at(-1); // 'c'- string
- Array
- 所有類型化數(shù)組類:Uint8Array 等。
-
RegExp 匹配索引:如果我們向正則表達(dá)式添加一個(gè)標(biāo)志,使用它會(huì)生成匹配對(duì)象,記錄每個(gè)組捕獲的開始和結(jié)束索引。 -
Object.hasOwn(obj, propKey)提供了一種安全的方法來(lái)檢查對(duì)象 obj 是否具有帶有 key 的自己的屬性 propKey。與相比 Object.prototype.hasOwnProperty,它適用于所有對(duì)象。