ES2017 的主要功能有什麼?

ES2017 的主要功能有什麼以及 ES2018 會帶來什麼?分兩部分去探索最新最好的 ECMAScript 的特性。第一部分探索主要特性如異步函數、共享內存以及 atomics ,而第二部分探索其他特性。javascript

看看 ECMA International, Technical Committee 39 ,事實證實 ES6 中的6並非發佈所需的年數。因爲 ES6/ES2015 花了很長時間發佈(6年),委員會決定每一年去發佈一點。我認爲這種勢頭會讓事情發生變化,並改善 JavaScript 。ES2017 會帶來什麼, ES2018 的列表呢?html

你能夠了解 TC39 議程進展從2ality經過Axel Rauschmayer:The TC39 Process for ECMAScript Featuresjava

ES2017

一月的 TC39 會議,該小組就 ECMAScript 提案進行了解決,該提案將被視爲 ES2017 的功能(也被稱爲 ES8,這應該是爲了不混淆)。列表包括:node

主要特性

次要特性

在該文章中,第一部分介紹上述所列的主要特性。第二篇文章介紹次要特性。git

Async Functions

Async Functions on GitHub (Proposed by Brian Terlson)程序員

在 ES2015 ,咱們使用 promise 幫助咱們避免回調地獄。github

async/await 語法受 TJ Holowaychuk 的 Co 軟件包啓發,讀起來像同步代碼。總結, async/await 關鍵字 及 try/catch 塊使得函數異步執行。它們像 generateors 同樣工做,但沒有轉換爲 Generateor 函數。這是這樣的:web

// Old Promise Town 
function fetchThePuppies(puppy) {
  return fetch(puppy)  
  .then(puppyInfo => puppyInfo.text())
  .then(text => {
    return JSON.parse(text)
  })  
  .catch(err =>
    console.log(`Error: ${err.message}`)
  )
}

// New Async/Await City 
async function fetchThePuppies(puppy) {
  try {
    let puppyInfo =  await  fetch(puppy)
    let text =  await puppyInfo.text()
    return  JSON.parse(text)
  }
  catch (err) {
    console.log(`Error: ${err.message}`)
  }
}
複製代碼

這並不意味着你應該把全部 promise 代碼替換成 async/await 。就像你不會把每個函數都用箭頭函數(但願),只在最合適的地方用這個語法。我不會講太多細節由於有蓋了 async/await 。去看一下。(上面前一個句子給了一些博文)。在即將到來的一年中,咱們將看到人們如何使他們的代碼更具備可讀性和更高效的使用 async/await 。編程

共享內存及 Atomics

Shared Memory and Atomics on GitHub (Proposed by Lars T. Hansen)數組

這個 ECMAScript 提案引入了 SharedArrayBuffer 和一個命名空間對象 Atomics 以及輔助函數至 ES2017 。

咱們使用 JavaScript 在瀏覽器中使用更多操做,這些操做依賴於 JIT 即時編譯器和快速 CPU 。不幸的是,正如 Lars T. Hansen 在他的一篇很棒的2016年三月的文章A Taste of JavaScript's New Parallel Primitives中說。

JS JIT 如今性能提高緩慢,而且 CPU 性能的改進大多停滯不前。 如今全部的消費級設備(從臺式機系統到智能手機)都擁有多個 CPU (真正的 CPU 內核),而不是更快的 CPU ,除了低端之外,它們一般有兩個以上。 一位想要爲程序提供更高性能的程序員必須開始並行使用多個內核。 這對於全部用多線程編程語言( Java , Swift , C# 和 C ++ )編寫的「本機」應用程序來講都不是問題,可是對於多 CPU 上運行很是有限的 JS 是個問題( web workers, 只有緩慢的消息傳遞和少數方式去避免數據拷貝)。

SharedArrayBuffer

該提案爲咱們提供多核計算的構建基礎,去研究不一樣方式去實現 JS 高級並行架構。這些構建基礎是什麼? SharedArrayBuffer 瞭解一下。MDN有簡潔的定義,我貼在這裏:

SharedArrayBuffer 對象做爲一個通用的、長度固定的raw二進制數據緩存塊,跟 ArrayBuffer 對象類似,可是他們能夠在共享內存中建立視圖。不像 ArrayBuffer , SharedArrayBuffer 不能分離。

我不知道你會不會跟我第一次讀到的時候感覺同樣 「???」。

基本上,咱們可以運行並行任務的首要方式之一是使用 web workers 。因爲 workers 運行在它本身的全局環境中且沒法分享,除非 workers 間進行交流或者跟主線程交流。更好的是, SharedArrayBuffer 對象容許你去分享字節數據在多個 wrokers 和主線程中。再者,與前身 ArrayBuffer 不一樣, SharedArrayBuffer 能夠同時被多方(例如 web workers 或者 web 頁面主程序)引用。你可使用 postMessage 將 SharedArrayBuffer 從其中一方轉移到另外一方。把它放在一塊兒,使用 SharedArrayBuffer 在多個工做者和主線程之間傳輸數據,以即可以一次執行多個任務,這些任務在 JavaScript 中是並行的。

SharedArrayBuffer 新消息

重要!注意 SharedArrayBuffer 的暫時擱置。 若是你最近一直關注這個新聞,你可能會了解處處理器芯片安全設計缺陷致使兩個漏洞: MeltdownSpectre閱讀它,知道瀏覽器禁用 SharedArrayBuffer ,直到解決此問題。

Atomics

並行的下一站: Atomics ,一個有兩個方法的全局變量。首先,介紹一下 Atomics 方法要解決的問題:在各方(如 web workers 或 Web頁面的主程序)共享 SharedArrayBuffer 時,各方能夠隨時讀取和寫入其內存。那麼,你如何保持一致性及訪問順序化,確保各方知道要等待其餘方完成他們的數據寫入?

Atomics 有 wakeload 方法。各方將會「休眠」在等待隊列中,等待其餘方完成寫入數據,因此 Atomics.wake 是一個讓各方「醒來」的方法。當你須要讀數據的時候,你用 Atomics.load 去從某個地點裝載數據,這個位置須要輸入兩個參數,TypedArray,一類數組機制去訪問raw二進制數據(即 SharedArrayBuffer),和一個下標去尋找在 TypedArray 的位置。除了咱們剛纔介紹的內容以外,還有更多的內容,但這是它的要點。

目前, Atomics 只有這兩種方法。 最後, Hansen (咱們這個提案的做者和並行事物的解釋者)說,應該有更多的方法,好比 store 和 compareExchange 來真正實現同步。相對而言,咱們正處於 JavaScript 並行的開始階段,這個提議爲咱們提供了實現這些目標的基石。

雖然這是一個值得思考的問題,但這仍然是一個高度歸納。此更新可能在下一年不會被大多數開發人員使用,但會有助於推動 JavaScript 讓每一個人受益。 因此,感謝你的閱讀,並瀏覽這些奇妙資源去深刻了解!

更多內容:

本文翻譯自原文 -ECMAScript Goodies I: Check out the ES2017 Major Features。不按期更新技術博文歡迎star。因爲本人水平有限,錯誤之處在所不免,敬請指正!轉載請註明出處,保留原文連接以及做者信息。

相關文章
相關標籤/搜索