當前位置:
首頁 > 知識 > JavaScript ES2017 中值得期待的功能

JavaScript ES2017 中值得期待的功能

JavaScript ES2017 中值得期待的功能

由於ES6 / ES2015花了大約6年的時間,才得以發布,因此負責JavaScript語言規範的技術委員會TC39,決定按年度周期來發布ES。這種變化允許ES語言規範,以更小和更迭代的版本形式進行發布。這樣可以保證:如果特徵語言規格在今年截止日期之前沒有完成,那麼它可以包含在明年的發布版本中。這種較小但功能強大的年度發布周期形式,允許語言規範持續增長。


ES2017介紹

對很大一部分JavaScript開發者來說,ES2017可以讓他們感受到新的、閃亮的技術前沿工具。無論是完全接受這項新技術,還是簡單地只使用其中測試工具的功能,我們都想知道ES2017中到底有什麼。

如果你熱衷於了解這個令人興奮的社區提供的所有新技術,下面是ES2017所包含的技術細節。


主要特點

1、非同步函數

TJ Holowaychuk是JavaScript社區的一個巨大貢獻者。TJ曾在Express, Koa, Rework, 和Co這樣的項目中工作過,他的代碼直接或間接地成為這些開發項目中的重要組成部分。

他對Co包做出的貢獻,對最近轉移到Stage 4 的Async Await功能規格產生了巨大的影響。Co 是一個利用Promises和Generator函數允許以更加同步的方式來讀取非同步JavaScript代碼語法的庫。

用Promises處理Async函數的一種普遍流程如下所示:

function fetchData(url) {

return fetch(url)

.then(request => request.text())

.then(text => {

return JSON.parse(text);

})

.catch(err => {

console.log(`Error: ${err.stack}`);

});

}

使用ES2017中的新增async和await關鍵字,我們可以利用全新的、與Co高度相似的語法來實現完全同步讀取。我們可以使用try / catch blocks和新的關鍵字來為特定功能分配非同步行為。在內部,Async功能與生成器的功能相同,但是卻不能轉換為Generator Functions。就像這樣:

async function fetchData(url) {

try {

let request = await fetch(url);

let text = await request.text();

return JSON.parse(text);

}

catch (err) {

console.log(`Error: ${err.stack}`);

}

}

可以使用以下的方式編寫ES2017中的Async函數:

非同步函數聲明

async function fooBar( ) { }

非同步函數表達式

const fooBar = async function ( ) { };

非同步方法定義

let obj = { async fooBar( ) { } }

非同步箭頭函數

const fooBar = async ( ) => { };

2、共享內存和Atomics

Lars Hansen提出了ES2017中共享內存和Atomics的建議,截至2017年2月,它已在第4階段中被批准,並包含到規範中。

此功能引入了一個新的低級別Atomics命名空間對象和一個SharedArrayBuffer構造函數,來作為更高級別並發抽象的原始構建塊。這使開發人員能夠共享多個service worker和核心線程之間的SharedArrayBuffer對象的數據。這種引入帶來了巨大的益處,因為可以更輕鬆地在worker之間共享數據,從而可以改善worker之間的協調。


次要功能

1、功能參數列表和調用中的結尾逗號

該函數結尾逗號的建議是一個純粹的語法更新的規範。在此規範更改之前,不允許在最後一個函數參數後面加上逗號,如下所示:

const trailCommaFn = function(

param1,

param2,

param3,

param4) { // No comma allowed here!

// do something in function body

}

ES2017帶來了結尾逗號:

const trailCommaFn = function(

param1,

param2,

param3,

param4, // Comma allowed here!

) {

// do something in function body

}

這種語法更新使得函數中的逗號與規範的其餘部分更加一致。在數組和對象文字中使用後綴逗號已經很普遍,現在我們可以使用相同的行為來進行函數列表和調用。

// Array

const arr = [

1,

2,

3, // <--- Ok

];

// Object Literal

const obj = {

x: "foo",

y: "bar",

z: "baz", // <--- Ok

}

另外,這個規格更改是git友好的,因為開發人員不再需要編輯2行代碼,以便為功能列表或調用添加1個參數。即使在最後一個參數之後,現在也可以使用逗號。

2、Object.values / Object.entries

Jordan Harband提出的Object.entries引入了一個entry概念。對象是鍵值對的數據結構,每個鍵值對都是entry。Object.entries(x)強制轉換x為對象,並以數組的方式返回其可枚舉的自定義字元串:

>> Object.entries({ foo: 1, bar: 2 })

[ [ "foo", 1 ], [ "bar", 2 ] ]

與Object.entries非常相似,Object.values返回一個數組,其值為可枚舉的字元串鍵值屬性:

>> Object.values({ foo: 1, bar: 2 })

[ 1, 2 ]

兩種方法的簽名Object.entries( )和Object.values( )如下:

Object.entries(value:any):Array <[string,any]>

Object.values(value:any):Array

3、字元串填充

引入了String Padding規範功能,為JavaScript的一些本地方法提供了處理字元串功能。它提供了padStart和padEnd以及trimStart和trimEnd方法,從而使開發人員更好地控制字元串原語。

>> console.log("testing".padStart(12).length)

" testing" is 12

>> console.log("testing".padStart(12, "_"))

"_____testing" is 12

4、Object.getOwnPropertyDescriptors

ECMAScript中沒有單個方法來簡化兩個對象之間的正確拷貝。之前,功能編程和不可變對象是複雜應用程序的重要組成部分,每個框架或庫都在實現自己的樣板,以便在合成對象或原型之間,能夠正確複製屬性。

Object.getOwnPropertyDescriptors( )是一個複數函數Object.getOwnPropertyDescriptor( )旨在簡化JavaScript中複製對象的過程。

Object.defineProperties( )這個新的規範功能的引入,允許decorators可以輕鬆地從另一個類或混合中提取出所有的描述符,並將它們分配給一個新的對象。

這個提案的部分原因,也是因為使用Object.assign( )方法不夠理想。Object.assign( )以吞噬行為的方式複製對象- 它直接訪問屬性和符號而不是其描述符。當涉及組合和處理複雜對象和類的原型時,這可能會成為一個更為危險的問題。

通過這個規範更新,開發人員不再需要依賴Object.assign( )來複制對象,而是利用一個真正的淺層拷貝的創建:

// Given an object `obj`

>> Object.create(

Object.getPrototypeOf(obj),

Object.getOwnPropertyDescriptors(obj)

);


更多TC39流程信息

TC39更改為年度發布周期,同時也修改了規範提案的處理方式。引入提案階段為開源JS社區創建了更好的組織規則和透明度。每個提案必須經過Stage 0到Stage 4,最終才能成為語言規範的一部分。

Stage 0 被稱為「Strawman」階段,其目的僅在於輸入規範的初始階段。

Stage 1 被稱為提案階段,提案者為特性添加提供了案例,描述了解決方案並確定了可能出現的問題。

Stage 2 被稱為草案階段,期間提議者必須使用正式規範語言精確地描述語法和語義。

Stage 3 被稱為候選階段,期間提議者必須大量測試這些功能/功能。此階段的提案預示著,需要進一步細化實施和用戶的反饋。

Stage 4被稱為完成階段,這表明該添加項已準備好納入正式的ECMAScript標準。

目前,有7項提案在該流程的第3階段,最有可能達到ES2018規範發布的第4階段的要求。它們如下:

  • Function.prototype.toString

  • global

  • import()

  • Rest/Spread Properties

  • SIMD.JS - SIMD API

  • Lifting Template Literal Restriction

  • Asynchronous Iteration

要了解有關即將到來的JavaScript版本的更改和更新的更多信息,請持續關注TC39 Github Repository上的提案階段列表。


現在使用ES2017功能

如果你渴望測試這些ES2017的功能,尤其是async和await,可以通過Babel"s Docs on ES2017 Preset來獲取,它將所有ES2017功能編譯成了ES2016代碼。此外,你還可以使用Babel的最新預設,它允許在代碼庫中編譯所有ES2015,ES2016和最終ES2017功能。


JavaScript開發工具介紹:

Wijmo是一款用TypeScript編寫的新一代JavaScript/HTML5控制項集。在全球率先支持AngularJS,並提供性能卓越、零依賴的FlexGrid表格控制項和圖表等多個控制項,是構建企業應用程序的全套控制項集。

英文鏈接:https://medium.com/komenco/what-to-expect-from-javascript-es2017-the-async-edition-618e28819711

轉載請註明出自:葡萄城控制項

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 葡萄城控制項 的精彩文章:

2017年前端框架、類庫、工具大比拼
SpreadJS全面支持Angular2,V10.2版本即將發布
最流行的5個前端框架對比
SpreadJS 在 Angular2 中支持綁定哪些屬性?
全新Wijmo5中文學習指南正式上線

TAG:葡萄城控制項 |

您可能感興趣

6月5日蘋果wwdc大會搶先看!iPhone SE2和iOS12最值得期待是嗎?
Supreme 2018ss 最受期待的 Photo Tee 發售信息鎖定!
iOS 11.3值得期待的6大理由:老款iPhone有救了
蘋果發布iOS 11.4 beta:AirPlay2功能回歸 有你期待的功能嗎?
GoogleI/O2018——我們期待Google的大秀
三星Galaxy Note 9的S Pen「值得期待」
耐克Mercurial VaporMax全新聯名款,2018年運動潮男的期待
期待值爆棚的REACT Element 87,加持了Virgil Abloh設計還得了?
值得期待的配色!Virgil Abloh x Nike Air Max 90 V2高清設計圖出現!
2018年最值得期待的智能新機是哪款?iPhoneXP還是華為mate11?
OW聯名Element 87?值得期待
瞬間秒殺Supreme聯名款!BAPE x Nike Air Max 98鞋款期待嗎?
新MacBook Air or iPad?期待蘋果3月27發驚喜
Google I/O 2018有什麼值得期待?
DOTA2:Ti8Ehome變陣,xiao8加盟執教 還有那些中國隊值得期待?
你最期待的是哪一部?AnimeJapan 2018動畫PV大匯總
期待!AnimeJapan2018視覺圖公布
[Infinite][新聞]180323 《Photo People》可以期待 優賢x曹世鎬現身澀谷
華為mate20再曝,採用屏下指紋+麒麟980+GPU tubro,你期待嗎
Magic Leap One操作系統或叫Lumin 外媒評2018最受期待VR頭顯