文档章节

JavaScript ES2017 中值得期待的功能

葡萄城控件技术团队
 葡萄城控件技术团队
发布于 2017/06/14 14:37
字数 2155
阅读 1285
收藏 22
点赞 1
评论 6

由于ES6 / ES2015花了大约6年的时间,才得以发布,因此负责JavaScript语言规范的技术委员会TC39,决定按年度周期来发布ES。这种变化允许ES语言规范,以更小和更迭代的版本形式进行发布。这样可以保证:如果特征语言规格在今年截止日期之前没有完成,那么它可以包含在明年的发布版本中。这种较小但功能强大的年度发布周期形式,允许语言规范持续增长。

 

ES2017介绍

对很大一部分JavaScript开发者来说,ES2017可以让他们感受到新的、闪亮的技术前沿工具。无论是完全接受这项新技术,还是简单地只使用其中测试工具的功能,我们都想知道ES2017中到底有什么。

如果你热衷于了解这个令人兴奋的社区提供的所有新技术,下面是ES2017所包含的技术细节。

 

主要特点
1、异步函数

TJ HolowaychukJavaScript社区的一个巨大贡献者。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({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 <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)
   );

更多TC39流程信息

TC39更改为年度发布周期,同时也修改了规范提案的处理方式。引入提案阶段为开源JS社区创建了更好的组织规则和透明度。每个提案必须经过Stage0到Stage4,最终才能成为语言规范的一部分。

Stage0 被称为“Strawman”阶段,其目的仅在于输入规范的初始阶段。

Stage1 被称为提案阶段,提案者为特性添加提供了案例,描述了解决方案并确定了可能出现的问题。

Stage2 被称为草案阶段,期间提议者必须使用正式规范语言精确地描述语法和语义。

Stage3 被称为候选阶段,期间提议者必须大量测试这些功能/功能。此阶段的提案预示着,需要进一步细化实施和用户的反馈。

Stage4 被称为完成阶段,这表明该添加项已准备好纳入正式的ECMAScript标准。

有关每个阶段的更多信息,请参阅TC39官方流程文件

目前,有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功能。

想要深入了解新的ES2017规格功能,可以查看Dr. Axel Rauschmayer的“ Exploring ES2016 & Es2017”

 

JavaScript开发工具介绍:

SpreadJS 纯前端表格控件是基于HTML5的JavaScript电子表格和网格功能控件,提供了完备的公式引擎、排序、过滤、输入控件、数据可视化、Excel导入/导出等功能,适用于.NET、Java和移动端等各平台在线编辑类Excel功能的表格程序开发。

 

英文链接:https://medium.com/komenco/what- ... dition-618e28819711

转载请注明出自:葡萄城控件

© 著作权归作者所有

共有 人打赏支持
葡萄城控件技术团队

葡萄城控件技术团队

粉丝 321
博文 487
码字总数 694630
作品 13
西安
高级程序员
加载中

评论(6)

奥道易通短信平台
奥道易通短信平台
问题愈来愈多
吴笑笑
不兼容的问题永远是在增加的。。
sanny31
sanny31
js的学习成本...
xmut
xmut
坑是越来越多,各种奇淫技巧
IdleMan
IdleMan
坑是越来越多
吃鱼只吃三道鳞
吃鱼只吃三道鳞
这不是已经出来了。
webpack 1——核心概念的理解

引子 为什么要写这篇文章?因为今天掘金的早报有一篇关于 Webpack 的入门的文章,读完之后发现自己确实该学习一下 Webpack 了,所以有了这篇文章。 我对于 webpack 的了解仅限于在 vue-cli ...

AdityaSui ⋅ 05/17 ⋅ 0

weex eros框架源码解析

weex eros是基于alibaba weex框架进行二次封装的客户端跨平台开发框架,主要是为前端开发者(可以不用熟悉客户端开发)提供的一站式客户端app开发解决方案。官网地址为:https://bmfe.github...

雅爸学技术 ⋅ 05/27 ⋅ 0

代码格式化开源工具Prettier

Prettier是一款自动规范和标准化代码格式的开源工具,不会影响其执行,开发人员可以用自己的风格进行编码,同时生成可读性高的代码,以提高互操作性和协作性。软件遵守MIT开源协议。 举例: ...

marsdream ⋅ 05/04 ⋅ 0

Facebook 正在重构 React Native,将重写大量底层

Facebook 五年前为 React Native 框架设计的原则,负面影响了与 JavaScript 代码的整合程度,也加大了某些特性的开发难度。因此 Facebook 现在准备对 React Native 架构进行重构,通过引入更...

局长 ⋅ 06/16 ⋅ 0

iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge

iOS下JS与OC互相调用(六)--WKWebView + WebViewJavascriptBridge 转载:原地址 https://www.jianshu.com/p/e951af9e5e74 上一篇文章介绍了UIWebView 如何通过WebViewJavascriptBridge 来实现......

法斗斗 ⋅ 05/11 ⋅ 0

Modern JS中的流控制:CallBacks->Promises->Async/Await

今天来聊一聊JS中的异步发展,还有推荐的异步调用写法. 单线程模式 JS运行在一个单处理线程上运行。当你操作一个标签时,其他的JS代码就会等待该操作执行完毕。浏览器的DOM操作不会发生在并行...

含笑666 ⋅ 06/06 ⋅ 0

Go 语言集成开发环境 GoLand 更新至 2018.1.3 版本

GoLand 2018.1.3 已发布,这是一个全新的更新,尽管没有带来明显的针对 Go 语言的特定改进,但还是提供了许多与 UI,JavaScript 和 SQL 支持相关的错误修复和改进。 可通过 Toolbox App 进行...

局长 ⋅ 05/11 ⋅ 15

前端开发指南:ES6的生成器和迭代器

     ES6为JavaScript语言带来了许多新特性。其中两个特性,生成器和迭代器,极大地改变了我们在更复杂的前端代码中编写特定函数的方式。   虽然他们之间的关系很好,但他们实际上做的...

webstack前端栈 ⋅ 04/19 ⋅ 0

5分钟了解TypeScript

1.安装TypeScript 有两种方式安装TypeScript: Via npm 通过安装VS插件,更多可参见这里。 对于npm用户,可以直接使用下面的命令行安装: nmp install -g TypeScript 2.创建第一个TypeScript文...

zhanggui ⋅ 06/12 ⋅ 0

深入框架本源系列 —— Virtual Dom

该系列会逐步更新,完整的讲解目前主流框架中底层相通的技术,接下来的代码内容都会更新在 这里 为什么需要 Virtual Dom 众所周知,操作 DOM 是很耗费性能的一件事情,既然如此,我们可以考虑...

夕阳 ⋅ 06/02 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

一篇文章学懂Shell脚本

Shell脚本,就是利用Shell的命令解释的功能,对一个纯文本的文件进行解析,然后执行这些功能,也可以说Shell脚本就是一系列命令的集合。 Shell可以直接使用在win/Unix/Linux上面,并且可以调用...

Jake_xun ⋅ 35分钟前 ⋅ 0

大数据工程师需要精通算法吗,要达到一个什么程度呢?

机器学习是人工智能的一个重要分支,而机器学习下最重要的就是算法,本文讲述归纳了入门级的几个机器学习算法,加大数据学习群:716581014一起加入AI技术大本营。 1、监督学习算法 这个算法由...

董黎明 ⋅ 今天 ⋅ 0

Kylin 对维度表的的要求

1.要具有数据一致性,主键值必须是唯一的;Kylin 会进行检查,如果有两行的主键值相同则会报错。 2.维度表越小越好,因为 Kylin 会将维度表加载到内存中供查询;过大的表不适合作为维度表,默...

无精疯 ⋅ 今天 ⋅ 0

58到家数据库30条军规解读

军规适用场景:并发量大、数据量大的互联网业务 军规:介绍内容 解读:讲解原因,解读比军规更重要 一、基础规范 (1)必须使用InnoDB存储引擎 解读:支持事务、行级锁、并发性能更好、CPU及...

kim_o ⋅ 今天 ⋅ 0

代码注释中顺序更改 文件读写换行

`package ssh; import com.xxx.common.log.LogFactory; import com.xxx.common.log.LoggerUtil; import org.apache.commons.lang3.StringUtils; import java.io.*; public class DirErgodic ......

林伟琨 ⋅ 今天 ⋅ 0

linux实用操作命令

参考 http://blog.csdn.net/qwe6112071/article/details/50806734 ls [选项] [目录名 | 列出相关目录下的所有目录和文件 -a 列出包括.a开头的隐藏文件的所有文件-A 同-a,但不列出"."和"...

简心 ⋅ 今天 ⋅ 0

preg_match处理中文符号 url编码方法

之前想过直接用符号来替换,但失败了,或者用其他方式,但有有些复杂,这个是一个新的思路,亲测可用 <?php$str='637朗逸·超速新风王(300)(白光)'; $str=iconv("UTF-8","GBK",$s...

大灰狼wow ⋅ 今天 ⋅ 0

DevOps 资讯 | PostgreSQL 的时代到来了吗 ?

PostgreSQL是对象-关系型数据库,BSD 许可证。拼读为"post-gress-Q-L"。 作者: Tony Baer 原文: Has the time finally come for PostgreSQL?(有删节) 近30年来 PostgreSQL 无疑是您从未听...

RiboseYim ⋅ 今天 ⋅ 0

github太慢

1:用浏览器访问 IPAddress.com or http://tool.chinaz.com 使用 IP Lookup 工具获得github.com和github.global.ssl.fastly.net域名的ip地址 2:/etc/hosts文件中添加如下格式(IP最好自己查一...

whoisliang ⋅ 今天 ⋅ 0

非阻塞同步之 CAS

为解决线程安全问题,互斥同步相当于以时间换空间。多线程情况下,只有一个线程可以访问同步代码。这种同步也叫阻塞同步(Blocking Synchronization). 这种同步属于一种悲观并发策略。认为只...

长安一梦 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部