ES8(ECMAScript 2017) 语言规范发布,附ES6,ES7,ES8规范文档下载

Ecma 国际公布了第八版的 ECMAScript 语言规范 ECMAScript 2017(或 ES8)。ECMAScript 是标准化的 JavaScript 语言,1997 年发布了第一版,1998 年和 1999 年发布了第二和第三个版本,之后沉寂 了许多年,直到 Ajax 流行起来后标准工作才再次起步,2009 年发布了第五个版本,自 2015 年起每年发布一个版本。ECMAScript 2017 的主要变化包括:Object.values/Object.entries、字符串填充、Object.getOwnPropertyDescriptor、尾随逗号、异步函数、共享内存和原子,等。

ECMAScript 2018 已在制定中。

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。就像这样: 
可以使用以下的方式编写ES2017中的Async函数:

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}`);  

 }  

}  

异步函数声明

asyncfunction fooBar( ) { }

异步函数表达式

constfooBar = async function ( ) { };

异步方法定义

letobj = { async fooBar( ) { } }

异步箭头函数

constfooBar = async ( ) => { };

2、共享内存和Atomics

Lars Hansen提出了ES2017中 共享内存和Atomics的建议,截至2017年2月,它已在第4阶段中被批准,并包含到规范中。

此功能引入了一个新的低级别Atomics命名空间对象和一个SharedArrayBuffer构造函数,来作为更高级别并发抽象的原始构建块。这使开发人员能够共享多个service worker和核心线程之间的SharedArrayBuffer对象的数据。这种引入带来了巨大的益处,因为可以更轻松地在worker之间共享数据,从而可以改善worker之间的协调。

有关新的Atomics对象和SharedArrayBuffer构造函数的信息,请阅读深入分析或阅读Lars Hansen的简短教程。

次要功能
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

JordanHarband提出的Object.entries引入了一个entry概念。对象是键值对的数据结构,每个键值对都是entry。Object.entries(x)强制转换x为对象,并以数组的方式返回其可枚举的自定义字符串:

>>Object.entries({foo1bar2})  

    [['foo'1],['bar'2]]  

与Object.entries非常相似,Object.values返回一个数组,其值为可枚举的字符串键值属性:

>> Object.values({foo1bar2})  

    [12]  

两种方法的签名Object.entries( )和Object.values( )如下:

Object.entriesvalueany):Array <[stringany]>  

Object.valuesvalueany):Array <any>  

3、字符串填充

引入了StringPadding规范功能,为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)  

  );

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值