ES6、ES7、ES8、ES9、ES10新特性一覽

ES6、ES7、ES8、ES9、ES10新特性一覽
ES全稱ECMAScript,ECMAScript是ECMA制定的標準化腳本語言。目前JavaScript使用的ECMAScript版本為ECMA-417。關於ECMA的最新資訊可以瀏覽 ECMA news查看。

ECMA規範最終由TC39敲定。TC39由包括瀏覽器廠商在內的各方組成,他們開會推動JavaScript提案沿著一條嚴格的發展道路前進。 從提案到入選ECMA規範主要有以下幾個階段:

  • Stage 0: strawman——最初想法的提交。
  • Stage 1: proposal(提案)——由TC39至少一名成員倡導的正式提案文件,該文件包括API事例。
  • Stage 2: draft(草案)——功能規範的初始版本,該版本包含功能規範的兩個實驗實現。
  • Stage 3: candidate(候選)——提案規範通過審查並從廠商那裡收集反饋
  • Stage 4: finished(完成)——提案准備加入ECMAScript,但是到瀏覽器或者Nodejs中可能需要更長的時間。

ES6新特性(2015)

ES6的特性比較多,在 ES5 發佈近 6 年(2009-11 至 2015-6)之後才將其標準化。兩個發佈版本之間時間跨度很大,所以ES6中的特性比較多。 在這裡列舉幾個常用的:

  • 模塊化
  • 箭頭函數
  • 函數參數默認值
  • 模板字符串
  • 解構賦值
  • 延展操作符
  • 對象屬性簡寫
  • Promise
  • Let與Const

1.類(class)

對熟悉Java,object-c,c#等純面嚮對象語言的開發者來說,都會對class有一種特殊的情懷。ES6 引入了class(類),讓JavaScript的面向對象編程變得更加簡單和易於理解。

ES6、ES7、ES8、ES9、ES10新特性一覽

2.模塊化(Module)

ES5不支持原生的模塊化,在ES6中模塊作為重要的組成部分被添加進來。模塊的功能主要由 export 和 import 組成。每一個模塊都有自己單獨的作用域,模塊之間的相互調用關係是通過 export 來規定模塊對外暴露的接口,通過import來引用其它模塊提供的接口。同時還為模塊創造了命名空間,防止函數的命名衝突。

導出(export)

ES6允許在一個模塊中使用export來導出多個變量或函數。

導出變量

ES6、ES7、ES8、ES9、ES10新特性一覽
心得:ES6不僅支持變量的導出,也支持常量的導出。 export const sqrt = Math.sqrt;//導出常量

ES6將一個文件視為一個模塊,上面的模塊通過 export 向外輸出了一個變量。一個模塊也可以同時往外面輸出多個變量。

ES6、ES7、ES8、ES9、ES10新特性一覽

導出函數

ES6、ES7、ES8、ES9、ES10新特性一覽

導入(import)

定義好模塊的輸出以後就可以在另外一個模塊通過import引用。

ES6、ES7、ES8、ES9、ES10新特性一覽
心得:一條import 語句可以同時導入默認函數和其它變量。import defaultMethod, { otherMethod } from 'xxx.js';

3.箭頭(Arrow)函數

這是ES6中最令人激動的特性之一。=>不只是關鍵字function的簡寫,它還帶來了其它好處。箭頭函數與包圍它的代碼共享同一個this,能幫你很好的解決this的指向問題。有經驗的JavaScript開發者都熟悉諸如var self = this;或var that = this這種引用外圍this的模式。但藉助=>,就不需要這種模式了。

箭頭函數的結構

箭頭函數的箭頭=>之前是一個空括號、單個的參數名、或用括號括起的多個參數名,而箭頭之後可以是一個表達式(作為函數的返回值),或者是用花括號括起的函數體(需要自行通過return來返回值,否則返回的是undefined)。

ES6、ES7、ES8、ES9、ES10新特性一覽
心得:不論是箭頭函數還是bind,每次被執行都返回的是一個新的函數引用,因此如果你還需要函數的引用去做一些別的事情(譬如卸載監聽器),那麼你必須自己保存這個引用。

卸載監聽器時的陷阱

錯誤的做法
ES6、ES7、ES8、ES9、ES10新特性一覽
正確的做法
ES6、ES7、ES8、ES9、ES10新特性一覽

除上述的做法外,我們還可以這樣做:

ES6、ES7、ES8、ES9、ES10新特性一覽
需要注意的是:不論是bind還是箭頭函數,每次被執行都返回的是一個新的函數引用,因此如果你還需要函數的引用去做一些別的事情(譬如卸載監聽器),那麼你必須自己保存這個引用。

4.函數參數默認值

ES6支持在定義函數的時候為其設置默認值:

ES6、ES7、ES8、ES9、ES10新特性一覽
不使用默認值:
ES6、ES7、ES8、ES9、ES10新特性一覽

這樣寫一般沒問題,但當參數的布爾值為false時,就會有問題了。比如,我們這樣調用foo函數:

foo(0, "")

因為0的布爾值為false,這樣height的取值將是50。同理color的取值為‘red’。

所以說,函數參數默認值不僅能是代碼變得更加簡潔而且能規避一些問題。

5.模板字符串

ES6支持模板字符串,使得字符串的拼接更加的簡潔、直觀。

不使用模板字符串:
ES6、ES7、ES8、ES9、ES10新特性一覽
使用模板字符串:
ES6、ES7、ES8、ES9、ES10新特性一覽

在ES6中通過${}就可以完成字符串的拼接,只需要將變量放在大括號之中。

6.解構賦值

解構賦值語法是JavaScript的一種表達式,可以方便的從數組或者對象中快速提取值賦給定義的變量。

獲取數組中的值

從數組中獲取值並賦值到變量中,變量的順序與數組中對象順序對應。

ES6、ES7、ES8、ES9、ES10新特性一覽

如果沒有從數組中的獲取到值,你可以為變量設置一個默認值。

ES6、ES7、ES8、ES9、ES10新特性一覽

通過解構賦值可以方便的交換兩個變量的值。

ES6、ES7、ES8、ES9、ES10新特性一覽

獲取對象中的值

ES6、ES7、ES8、ES9、ES10新特性一覽

7.延展操作符(Spread operator)

延展操作符...可以在函數調用/數組構造時, 將數組表達式或者string在語法層面展開;還可以在構造對象時, 將對象表達式按key-value的方式展開。

語法

函數調用:
ES6、ES7、ES8、ES9、ES10新特性一覽
數組構造或字符串:
ES6、ES7、ES8、ES9、ES10新特性一覽
構造對象時,進行克隆或者屬性拷貝(ECMAScript 2018規範新增特性):
ES6、ES7、ES8、ES9、ES10新特性一覽

應用場景

在函數調用時使用延展操作符
ES6、ES7、ES8、ES9、ES10新特性一覽
構造數組

沒有展開語法的時候,只能組合使用 push,splice,concat 等方法,來將已有數組元素變成新數組的一部分。有了展開語法, 構造新數組會變得更簡單、更優雅:

ES6、ES7、ES8、ES9、ES10新特性一覽

和參數列表的展開類似, ... 在構造字數組時, 可以在任意位置多次使用。

數組拷貝
ES6、ES7、ES8、ES9、ES10新特性一覽

展開語法和 Object.assign() 行為一致, 執行的都是淺拷貝(只遍歷一層)。

連接多個數組
ES6、ES7、ES8、ES9、ES10新特性一覽

在ECMAScript 2018中延展操作符增加了對對象的支持

ES6、ES7、ES8、ES9、ES10新特性一覽
使用 ... ,等同於上面的寫法
ES6、ES7、ES8、ES9、ES10新特性一覽
配合解構賦值避免傳入一些不需要的參數
ES6、ES7、ES8、ES9、ES10新特性一覽

8.對象屬性簡寫

在ES6中允許我們在設置一個對象的屬性的時候不指定屬性名。

不使用ES6
ES6、ES7、ES8、ES9、ES10新特性一覽

對象中必須包含屬性和值,顯得非常冗餘。

使用ES6
ES6、ES7、ES8、ES9、ES10新特性一覽

對象中直接寫變量,非常簡潔。

9.Promise

Promise 是異步編程的一種解決方案,比傳統的解決方案callback更加的優雅。它最早由社區提出和實現的,ES6 將其寫進了語言標準,統一了用法,原生提供了Promise對象。

不使用ES6

嵌套兩個setTimeout回調函數:

ES6、ES7、ES8、ES9、ES10新特性一覽
使用ES6
ES6、ES7、ES8、ES9、ES10新特性一覽

上面的的代碼使用兩個then來進行異步編程串行化,避免了回調地獄:

10.支持let與const

在之前JS是沒有塊級作用域的,const與let填補了這方便的空白,const與let都是塊級作用域。

使用var定義的變量為函數級作用域:
ES6、ES7、ES8、ES9、ES10新特性一覽
使用let與const定義的變量為塊級作用域:
ES6、ES7、ES8、ES9、ES10新特性一覽

ES7新特性(2016)

ES2016添加了兩個小的特性來說明標準化過程:

  • 數組includes()方法,用來判斷一個數組是否包含一個指定的值,根據情況,如果包含則返回true,否則返回false。
  • a ** b指數運算符,它與 Math.pow(a, b)相同。

1.Array.prototype.includes()

includes() 函數用來判斷一個數組是否包含一個指定的值,如果包含則返回 true,否則返回false。

includes 函數與 indexOf 函數很相似,下面兩個表達式是等價的:

ES6、ES7、ES8、ES9、ES10新特性一覽

接下來我們來判斷數字中是否包含某個元素:

在ES7之前的做法

使用indexOf()驗證數組中是否存在某個元素,這時需要根據返回值是否為-1來判斷:

ES6、ES7、ES8、ES9、ES10新特性一覽
使用ES7的includes()

使用includes()驗證數組中是否存在某個元素,這樣更加直觀簡單:

ES6、ES7、ES8、ES9、ES10新特性一覽

2.指數操作符

在ES7中引入了指數運算符**,**具有與Math.pow(..)等效的計算結果。

不使用指數操作符

使用自定義的遞歸函數calculateExponent或者Math.pow()進行指數運算:

ES6、ES7、ES8、ES9、ES10新特性一覽
使用指數操作符

使用指數運算符**,就像+、-等操作符一樣:

ES6、ES7、ES8、ES9、ES10新特性一覽

ES8新特性(2017)

  • async/await
  • Object.values()
  • Object.entries()
  • String padding: padStart()和padEnd(),填充字符串達到當前長度
  • 函數參數列表結尾允許逗號
  • Object.getOwnPropertyDescriptors()
  • ShareArrayBuffer和Atomics對象,用於從共享內存位置讀取和寫入

1.async/await

ES2018引入異步迭代器(asynchronous iterators),這就像常規迭代器,除了next()方法返回一個Promise。因此await可以和for...of循環一起使用,以串行的方式運行異步操作。例如:

ES6、ES7、ES8、ES9、ES10新特性一覽

2.Object.values()

Object.values()是一個與Object.keys()類似的新函數,但返回的是Object自身屬性的所有值,不包括繼承的值。

假設我們要遍歷如下對象obj的所有值:

ES6、ES7、ES8、ES9、ES10新特性一覽
不使用Object.values() :ES7
ES6、ES7、ES8、ES9、ES10新特性一覽
使用Object.values() :ES8
ES6、ES7、ES8、ES9、ES10新特性一覽

從上述代碼中可以看出Object.values()為我們省去了遍歷key,並根據這些key獲取value的步驟。

3.Object.entries()

Object.entries()函數返回一個給定對象自身可枚舉屬性的鍵值對的數組。

接下來我們來遍歷上文中的obj對象的所有屬性的key和value:

不使用Object.entries() :ES7
ES6、ES7、ES8、ES9、ES10新特性一覽
使用Object.entries() :ES8
ES6、ES7、ES8、ES9、ES10新特性一覽

4.String padding

在ES8中String新增了兩個實例函數String.prototype.padStart和String.prototype.padEnd,允許將空字符串或其他字符串添加到原始字符串的開頭或結尾。

String.padStart(targetLength,[padString])
  • targetLength:當前字符串需要填充到的目標長度。如果這個數值小於當前字符串的長度,則返回當前字符串本身。
  • padString:(可選)填充字符串。如果字符串太長,使填充後的字符串長度超過了目標長度,則只保留最左側的部分,其他部分會被截斷,此參數的缺省值為 " "。
ES6、ES7、ES8、ES9、ES10新特性一覽
String.padEnd(targetLength,padString])
  • targetLength:當前字符串需要填充到的目標長度。如果這個數值小於當前字符串的長度,則返回當前字符串本身。
  • padString:(可選) 填充字符串。如果字符串太長,使填充後的字符串長度超過了目標長度,則只保留最左側的部分,其他部分會被截斷,此參數的缺省值為 " ";
ES6、ES7、ES8、ES9、ES10新特性一覽

5.函數參數列表結尾允許逗號

主要作用是方便使用git進行多人協作開發時修改同一個函數減少不必要的行變更。

6.Object.getOwnPropertyDescriptors()

Object.getOwnPropertyDescriptors()函數用來獲取一個對象的所有自身屬性的描述符,如果沒有任何自身屬性,則返回空對象。

函數原型:
ES6、ES7、ES8、ES9、ES10新特性一覽

返回obj對象的所有自身屬性的描述符,如果沒有任何自身屬性,則返回空對象。

ES6、ES7、ES8、ES9、ES10新特性一覽

7.SharedArrayBuffer對象

SharedArrayBuffer 對象用來表示一個通用的,固定長度的原始二進制數據緩衝區,類似於 ArrayBuffer 對象,它們都可以用來在共享內存(shared memory)上創建視圖。與 ArrayBuffer 不同的是,SharedArrayBuffer 不能被分離。

ES6、ES7、ES8、ES9、ES10新特性一覽

8.Atomics對象

Atomics 對象提供了一組靜態方法用來對 SharedArrayBuffer 對象進行原子操作。

這些原子操作屬於 Atomics 模塊。與一般的全局對象不同,Atomics 不是構造函數,因此不能使用 new 操作符調用,也不能將其當作函數直接調用。Atomics 的所有屬性和方法都是靜態的(與 Math 對象一樣)。

多個共享內存的線程能夠同時讀寫同一位置上的數據。原子操作會確保正在讀或寫的數據的值是符合預期的,即下一個原子操作一定會在上一個原子操作結束後才會開始,其操作過程不會中斷。

  • Atomics.add()
將指定位置上的數組元素與給定的值相加,並返回相加前該元素的值。
  • Atomics.and()
將指定位置上的數組元素與給定的值相與,並返回與操作前該元素的值。
  • Atomics.compareExchange()
如果數組中指定的元素與給定的值相等,則將其更新為新的值,並返回該元素原先的值。
  • Atomics.exchange()
將數組中指定的元素更新為給定的值,並返回該元素更新前的值。
  • Atomics.load()
返回數組中指定元素的值。
  • Atomics.or()
將指定位置上的數組元素與給定的值相或,並返回或操作前該元素的值。
  • Atomics.store()
將數組中指定的元素設置為給定的值,並返回該值。
  • Atomics.sub()
將指定位置上的數組元素與給定的值相減,並返回相減前該元素的值。
  • Atomics.xor()
將指定位置上的數組元素與給定的值相異或,並返回異或操作前該元素的值。

wait() 和 wake() 方法採用的是 Linux 上的 futexes 模型(fast user-space mutex,快速用戶空間互斥量),可以讓進程一直等待直到某個特定的條件為真,主要用於實現阻塞。

  • Atomics.wait()
檢測數組中某個指定位置上的值是否仍然是給定值,是則保持掛起直到被喚醒或超時。返回值為 "ok"、"not-equal" 或 "time-out"。調用時,如果當前線程不允許阻塞,則會拋出異常(大多數瀏覽器都不允許在主線程中調用 wait())。
  • Atomics.wake()
喚醒等待隊列中正在數組指定位置的元素上等待的線程。返回值為成功喚醒的線程數量。
  • Atomics.isLockFree(size)
可以用來檢測當前系統是否支持硬件級的原子操作。對於指定大小的數組,如果當前系統支持硬件級的原子操作,則返回 true;否則就意味著對於該數組,Atomics 對象中的各原子操作都只能用鎖來實現。此函數面向的是技術專家。-->

ES9新特性(2018)

  • 異步迭代
  • Promise.finally()
  • Rest/Spread 屬性
  • 正則表達式命名捕獲組(Regular Expression Named Capture Groups)
  • 正則表達式反向斷言(lookbehind)
  • 正則表達式dotAll模式
  • 正則表達式 Unicode 轉義
  • 非轉義序列的模板字符串

1.異步迭代

在async/await的某些時刻,你可能嘗試在同步循環中調用異步函數。例如:

ES6、ES7、ES8、ES9、ES10新特性一覽

這段代碼不會正常運行,下面這段同樣也不會:

ES6、ES7、ES8、ES9、ES10新特性一覽

這段代碼中,循環本身依舊保持同步,並在在內部異步函數之前全部調用完成。

ES2018引入異步迭代器(asynchronous iterators),這就像常規迭代器,除了next()方法返回一個Promise。因此await可以和for...of循環一起使用,以串行的方式運行異步操作。例如:

ES6、ES7、ES8、ES9、ES10新特性一覽

2.Promise.finally()

一個Promise調用鏈要麼成功到達最後一個.then(),要麼失敗觸發.catch()。在某些情況下,你想要在無論Promise運行成功還是失敗,運行相同的代碼,例如清除,刪除對話,關閉數據庫連接等。

.finally()允許你指定最終的邏輯:

ES6、ES7、ES8、ES9、ES10新特性一覽

3.Rest/Spread 屬性

ES2015引入了Rest參數和擴展運算符。三個點(...)僅用於數組。Rest參數語法允許我們將一個不定數量的參數表示為一個數組。

ES6、ES7、ES8、ES9、ES10新特性一覽

展開操作符以相反的方式工作,將數組轉換成可傳遞給函數的單獨參數。例如Math.max()返回給定數字中的最大值:

ES6、ES7、ES8、ES9、ES10新特性一覽

ES2018為對象解構提供了和數組一樣的Rest參數()和展開操作符,一個簡單的例子:

ES6、ES7、ES8、ES9、ES10新特性一覽

或者你可以使用它給函數傳遞參數:

ES6、ES7、ES8、ES9、ES10新特性一覽

跟數組一樣,Rest參數只能在聲明的結尾處使用。此外,它只適用於每個對象的頂層,如果對象中嵌套對象則無法適用。

擴展運算符可以在其他對象內使用,例如:

ES6、ES7、ES8、ES9、ES10新特性一覽

可以使用擴展運算符拷貝一個對象,像是這樣obj2 = {...obj1},但是 這只是一個對象的淺拷貝。另外,如果一個對象A的屬性是對象B,那麼在克隆後的對象cloneB中,該屬性指向對象B。

4.正則表達式命名捕獲組

JavaScript正則表達式可以返回一個匹配的對象——一個包含匹配字符串的類數組,例如:以YYYY-MM-DD的格式解析日期:

ES6、ES7、ES8、ES9、ES10新特性一覽

這樣的代碼很難讀懂,並且改變正則表達式的結構有可能改變匹配對象的索引。

ES2018允許命名捕獲組使用符號?<name>,在打開捕獲括號(後立即命名,示例如下:/<name>

ES6、ES7、ES8、ES9、ES10新特性一覽

任何匹配失敗的命名組都將返回undefined。

命名捕獲也可以使用在replace()方法中。例如將日期轉換為美國的 MM-DD-YYYY 格式:

ES6、ES7、ES8、ES9、ES10新特性一覽

5.正則表達式反向斷言

目前JavaScript在正則表達式中支持先行斷言(lookahead)。這意味著匹配會發生,但不會有任何捕獲,並且斷言沒有包含在整個匹配字段中。例如從價格中捕獲貨幣符號:

ES6、ES7、ES8、ES9、ES10新特性一覽

ES2018引入以相同方式工作但是匹配前面的反向斷言(lookbehind),這樣我就可以忽略貨幣符號,單純的捕獲價格的數字:

ES6、ES7、ES8、ES9、ES10新特性一覽

以上是 肯定反向斷言,非數字\D必須存在。同樣的,還存在 否定反向斷言,表示一個值必須不存在,例如:

ES6、ES7、ES8、ES9、ES10新特性一覽

6.正則表達式dotAll模式

正則表達式中點.匹配除回車外的任何單字符,標記s改變這種行為,允許行終止符的出現,例如:

ES6、ES7、ES8、ES9、ES10新特性一覽

7.正則表達式 Unicode 轉義

到目前為止,在正則表達式中本地訪問 Unicode 字符屬性是不被允許的。ES2018添加了 Unicode 屬性轉義——形式為\p{...}和\P{...},在正則表達式中使用標記 u (unicode) 設置,在\p塊兒內,可以以鍵值對的方式設置需要匹配的屬性而非具體內容。例如:

ES6、ES7、ES8、ES9、ES10新特性一覽

此特性可以避免使用特定 Unicode 區間來進行內容類型判斷,提升可讀性和可維護性。

8.非轉義序列的模板字符串

之前,\\u開始一個 unicode 轉義,\\x開始一個十六進制轉義,\後跟一個數字開始一個八進制轉義。這使得創建特定的字符串變得不可能,例如Windows文件路徑 C:\\uuu\\xxx\111。更多細節參考模板字符串。

ES10新特性(2019)

  • 行分隔符(U + 2028)和段分隔符(U + 2029)符號現在允許在字符串文字中,與JSON匹配
  • 更加友好的 JSON.stringify
  • 新增了Array的flat()方法和flatMap()方法
  • 新增了String的trimStart()方法和trimEnd()方法
  • Object.fromEntries()
  • Symbol.prototype.description
  • String.prototype.matchAll
  • Function.prototype.toString()現在返回精確字符,包括空格和註釋
  • 簡化try {} catch {},修改 catch 綁定
  • 新的基本數據類型BigInt
  • globalThis
  • import()
  • Legacy RegEx
  • 私有的實例方法和訪問器

1.行分隔符(U + 2028)和段分隔符(U + 2029)符號現在允許在字符串文字中,與JSON匹配

以前,這些符號在字符串文字中被視為行終止符,因此使用它們會導致SyntaxError異常。

2.更加友好的 JSON.stringify

如果輸入 Unicode 格式但是超出範圍的字符,在原先JSON.stringify返回格式錯誤的Unicode字符串。現在實現了一個改變JSON.stringify的第3階段提案,因此它為其輸出轉義序列,使其成為有效Unicode(並以UTF-8表示)

3.新增了Array的flat()方法和flatMap()方法

flat()和flatMap()本質上就是是歸納(reduce) 與 合併(concat)的操作。

Array.prototype.flat()

flat() 方法會按照一個可指定的深度遞歸遍歷數組,並將所有元素與遍歷到的子數組中的元素合併為一個新數組返回。

  • flat()方法最基本的作用就是數組降維
ES6、ES7、ES8、ES9、ES10新特性一覽
  • 其次,還可以利用flat()方法的特性來去除數組的空項
ES6、ES7、ES8、ES9、ES10新特性一覽

Array.prototype.flatMap()

flatMap() 方法首先使用映射函數映射每個元素,然後將結果壓縮成一個新數組。它與 map 和 深度值1的 flat 幾乎相同,但 flatMap 通常在合併成一種方法的效率稍微高一些。 這裡我們拿map方法與flatMap方法做一個比較。

ES6、ES7、ES8、ES9、ES10新特性一覽

4.新增了String的trimStart()方法和trimEnd()方法

新增的這兩個方法很好理解,分別去除字符串首尾空白字符,這裡就不用例子說聲明瞭。

5.Object.fromEntries()

Object.entries()方法的作用是返回一個給定對象自身可枚舉屬性的鍵值對數組,其排列與使用 for...in 循環遍歷該對象時返回的順序一致(區別在於 for-in 循環也枚舉原型鏈中的屬性)。

而Object.fromEntries() 則是 Object.entries() 的反轉。

Object.fromEntries() 函數傳入一個鍵值對的列表,並返回一個帶有這些鍵值對的新對象。這個迭代參數應該是一個能夠實現@iterator方法的的對象,返回一個迭代器對象。它生成一個具有兩個元素的類似數組的對象,第一個元素是將用作屬性鍵的值,第二個元素是與該屬性鍵關聯的值。

  • 通過 Object.fromEntries, 可以將 Map 轉化為 Object:
ES6、ES7、ES8、ES9、ES10新特性一覽
  • 通過 Object.fromEntries, 可以將 Array 轉化為 Object:
ES6、ES7、ES8、ES9、ES10新特性一覽

6.Symbol.prototype.description

通過工廠函數Symbol()創建符號時,您可以選擇通過參數提供字符串作為描述:

ES6、ES7、ES8、ES9、ES10新特性一覽

以前,訪問描述的唯一方法是將符號轉換為字符串:

ES6、ES7、ES8、ES9、ES10新特性一覽

現在引入了getter Symbol.prototype.description以直接訪問描述:

ES6、ES7、ES8、ES9、ES10新特性一覽

7.String.prototype.matchAll

matchAll() 方法返回一個包含所有匹配正則表達式及分組捕獲結果的迭代器。 在 matchAll 出現之前,通過在循環中調用regexp.exec來獲取所有匹配項信息(regexp需使用/g標誌:

ES6、ES7、ES8、ES9、ES10新特性一覽

如果使用matchAll ,就可以不必使用while循環加exec方式(且正則表達式需使用/g標誌)。使用matchAll 會得到一個迭代器的返回值,配合 for...of, array spread, or Array.from() 可以更方便實現功能:

ES6、ES7、ES8、ES9、ES10新特性一覽

matchAll可以更好的用於分組

ES6、ES7、ES8、ES9、ES10新特性一覽
ES6、ES7、ES8、ES9、ES10新特性一覽

8.Function.prototype.toString()現在返回精確字符,包括空格和註釋

ES6、ES7、ES8、ES9、ES10新特性一覽

9.修改 catch 綁定

在 ES10 之前,我們必須通過語法為 catch 子句綁定異常變量,無論是否有必要。很多時候 catch 塊是多餘的。 ES10 提案使我們能夠簡單的把變量省略掉。

不算大的改動。

之前是

ES6、ES7、ES8、ES9、ES10新特性一覽

現在是

ES6、ES7、ES8、ES9、ES10新特性一覽

10.新的基本數據類型BigInt

現在的基本數據類型(值類型)不止5種(ES6之後是六種)了哦!加上BigInt一共有七種基本數據類型,分別是: String、Number、Boolean、Null、Undefined、Symbol、BigInt

作者:上沅兮鏈接:https://juejin.im/post/5ca2e1935188254416288eb2來源:掘金


分享到:


相關文章: