最近这些年,ECMASCript标准发展节奏非常稳定,每年都会发布新的特性。那么,ECMASCript 2019可能会有哪些特性呢?

ECMASCript语法提案的批准流程

JavaScript的标准即为ECMAScript,其标准委员会是TC39

所有语法提案都需要经历标准的批准流程,该流程包括5个阶段:

  • Stage 0 - Strawman(展示阶段)
  • Stage 1 - Proposal(征求意见阶段)
  • Stage 2 - Draft(草案阶段)
  • Stage 3 - Candidate(候选阶段)
  • Stage 4 - Finished(定案阶段)

只有语法特性到达Stage 4,该特性才能成为正式的ECMAScript标准。但是,JS引擎例如V8(Chrome和Node.js)以及SpiderMonkey(Firefox)会试验性地支持Stage 4之前的语法特性,这样开发者可以进行测试和反馈。

当我写这篇博客的时候,还没有新的Stage 4的语法提案,处于Stage 3的语法提案有好几个。ES2019可能不会包括所有Stage 3的语法提案。事实上,有些提案已经被搁置很多年了。

Class相关变化

有好几个提案是针对Class的,包括:

代码示例如下:

class Truck extends Automobile {
model = "Heavy Duty"; // 公有属性
#numberOfSeats = 5; // 私有属性
#isCrewCab = true;
static #name = "Truck"; // 静态私有属性 // 静态方法
static formattedName() {
return `This vehicle is a ${ Truck.#name }.`;
} constructor( model, seats = 2 ) {
super();
this.seats = seats;
} // 私有方法
#getBodyType() {
return this.#isCrewCab ? "Crew Cab" : "Standard Cab";
} bodyType() {
return `${ this.#numberOfSeats }-passenger ${ this.model } ${ this.#getBodyType() }`;
} get seats() { return this.#numberOfSeats; }
set seats( value ) {
if ( value >= 1 && value < 7 ) {
this.#numberOfSeats = value;
this.#isCrewCab = value > 3;
}
}
}

个人认为,使用#来定义私有成员不是很好,学习其他语言,使用private来定义显然更好。

String的trimStart()与trimEnd()方法

String有一个trim()方法可以移除字符串开头和结尾的空格,而trimStart()与trimEnd()方法则可以分别移除开头和结尾的空格:

const one = "      hello and let ";
const two = "us begin. ";
console.log( one.trimStart() + two.trimEnd() ) // 打印"hello and let us begin."

有趣的是,不少浏览器已经支持了这2个方法。可见,浏览器们一直在推动ECMASCript标准的进步。

使用BigInt定义大整数

Number所能定义的最大整数为2^53 ,对于更大数,则可以使用BigInt来定义:

// 最大的Number
const theBiggestIntegerToday = Number.MAX_SAFE_INTEGER; // 9007199254740991 // 在整数后面添加n来定义BigInt
const ABiggerInteger = 9100000000000001n; // 使用BigInt()
const EvenBigger = BigInt( 9100000000000002 ); // 9100000000000002n // 使用BigInt()
const SuchBigWow = BigInt( "9100000000000003" ); // 9100000000000003n

关于BigInt的更多使用示例,可以查看BigInt: arbitrary-precision integers in JavaScript

Array的flat()与flatMap()方法

如果你学习过函数式编程,那么你应该知道flat()和flatMap()。flat()可以将一个包含嵌套数组的数组变换为一维数组。

const nestedArraysOhMy = [ "a", ["b", "c"], ["d", ["e", "f"]]];
// flat()的参数为数组的嵌套深度
const ahhThatsBetter = nestedArraysOhMy.flat( 2 );
console.log( ahhThatsBetter ); // [ "a", "b", "c", "d", "e", "f" ]

flatMap()与map()类似,当回调函数返回数组时,flatMap()返回的是一维数组,而map()返回的是嵌套数组:

const scattered = [ "my favorite", "hamburger", "is a", "chicken sandwich" ];

const huh = scattered.map( chunk => chunk.split( " " ) );
console.log( huh ); // [ [ "my", "favorite" ], [ "hamburger" ], [ "is", "a" ], [ "chicken", "sandwich" ] ] const better = scattered.flatMap( chunk => chunk.split( " " ) );
console.log( better ); // [ "my", "favorite", "hamburger", "is", "a", "chicken", "sandwich" ]

其他ES2019候选特性

这些是当前的Stage 3候选特性:

ES2019什么时候发布?

过去几年,TC39通常在6月份发布ECMAScript标准。因此,ES2019很可能也会在今年6月份发布。

如何试用ES2019特性?

其实有些特性其实JS引擎已经支持了,我们只需要配置一下就好了。

使用Node.js 11

Node.js使用V8引擎,而V8引擎已经支持了一些最新的特性,例如Array.prototype.flat和String.prototype.trimEnd,因此使用最新版的Node.js,即Node.js 11即可试用这些特性。

我使用的Node.js版本为11.8.0:

node -v
v11.8.0

如果要启用某个特性,可以使用node命令的--harmony-{feature-flag}选项。使用--v8-options,则可以查看node命令的所有选项,一些实验性的特性被标记为"in progress"。

macOS / Linux

node --v8-options | grep "in progress"
--harmony-do-expressions (enable "harmony do-expressions" (in progress))
--harmony-class-fields (enable "harmony fields in class literals" (in progress))
--harmony-static-fields (enable "harmony static fields in class literals" (in progress))
--harmony-await-optimization (enable "harmony await taking 1 tick" (in progress))
--harmony-locale (enable "Intl.Locale" (in progress))
--harmony-intl-list-format (enable "Intl.ListFormat" (in progress))
--harmony-intl-relative-time-format (enable "Intl.RelativeTimeFormat" (in progress))

Windows

node --v8-options | find "in progress"

例如,当我们的Node.js代码index.js中的Class有静态方法,则在执行的时候添加--harmony-static-fields选项即可:

node --harmony-class-fields --harmony-static-fields index.js

使用Babel 7.0 +

使用Babel,我们就可以使用最新的JavaScript语法了,因为它会对代码进行转换以兼容旧的浏览器。

Babel支持通过一些插件来支持实验性的JS特性。Babel所支持的ECMAScript特性提案可以查看babel/proposals仓库。

参考

关于Fundebug

Fundebug专注于JavaScript、微信小程序、微信小游戏、支付宝小程序、React Native、Node.js和Java线上应用实时BUG监控。 自从2016年双十一正式上线,Fundebug累计处理了9亿+错误事件,付费客户有Google、360、金山软件、百姓网等众多品牌企业。欢迎大家免费试用

版权声明

转载时请注明作者Fundebug以及本文地址:

https://blog.fundebug.com/2019/01/30/what-is-new-in-javascript-for-2019/

ECMASCript 2019可能会有哪些特性?的更多相关文章

  1. ECMAScript正则表达式6个最新特性

    译者按: 还没学好ES6?ECMAScript 2018已经到来啦! 原文:ECMAScript regular expressions are getting better! 作者: Mathias ...

  2. ES-Next & ECMAScript 2019

    ES-Next & ECMAScript 2019 Data Types 8 种 js 基本数据类型 8 zhon The latest ECMAScript standard defines ...

  3. ECMAScript 2019(ES10)新特性简介

    简介 ES10是ECMA协会在2019年6月发行的一个版本,因为是ECMAScript的第十个版本,所以也称为ES10. 今天我们讲解一下ES10的新特性. ES10引入了2大特性和4个小的特性,我们 ...

  4. ECMAScript各版本简介及特性

    术语 ECMAScript Sun(现在的Oracle)公司持有着“Java”和“JavaScript”的商标.这就让微软不得不把自己的JavaScript方言称之为“JScript”.然后,在这门语 ...

  5. 个人认为目前比较好用的ECMAScript(16-20)新特性

    ECMAScript(16.17.18.19)新特性 Array.prototype.includes includes 是数组上的简单实例方法,可以轻松查找到数组中是否包含指定内容(包括NaN) 返 ...

  6. ECMAScript 6 一些有意思的特性

    主要参考了下面两篇博文,对ES6的新特性做一些笔记,加深印象 ES6新特性概览 - 刘哇勇 - 博客园 es6快速入门 - _marven - 博客园 *号函数 迭代函数生成器 我能想到的生成器使用场 ...

  7. ECMAScript 2016(ES7)新特性简介

    简介 自从ES6(ECMAScript 2015)在2015年发布以来,ECMAScript以每年一个版本的速度持续向前发展.到现在已经是ECMAScript 2020了. 每个版本都有一些新的特性, ...

  8. 阅读:ECMAScript 6 入门(1)

    参考 ECMAScript 6 入门 ES6新特性概览 ES6 全套教程 ECMAScript6 (原著:阮一峰) JavaScript 教程 重新介绍 JavaScript(JS 教程) 前言 学了 ...

  9. SQL Server 2019 深度解读:微软数据平台的野望

    本文为笔者在InfoQ首发的原创文章,主要利用周末时间陆续写成,也算近期用心之作.现转载回自己的公众号,请大家多多指教. 11 月 4 日,微软正式发布了其新一代数据库产品 SQL Server 20 ...

随机推荐

  1. LeetCode编程训练 - 拓扑排序(Topological Sort)

    拓扑排序基础 拓扑排序用于解决有向无环图(DAG,Directed Acyclic Graph)按依赖关系排线性序列问题,直白地说解决这样的问题:有一组数据,其中一些数据依赖其他,问能否按依赖关系排序 ...

  2. JVM性能调优监控命令jps、jinfo、jstat、jmap+jhat、jstack使用详解

    JDK本身提供了很多方便的JVM性能调优监控工具,除了集成式的VisualVM和jConsole外,还有jps.jinfo.jstat.jmap+jhat.jstack等小巧的工具,本博客希望能起抛砖 ...

  3. Thread.join(), CountDownLatch、CyclicBarrier和 Semaphore区别,联系及应用

    在java 1.5中,提供了一些非常有用的辅助类来帮助我们进行并发编程,比如CountDownLatch,CyclicBarrier和Semaphore,今天我们就来学习一下这三个辅助类的用法, 由于 ...

  4. Go语言数组和切片的原理

    目录 数组 创建 访问和赋值 切片 结构 初始化 访问 追加 拷贝 总结 数组和切片是 Go 语言中常见的数据结构,很多刚刚使用 Go 的开发者往往会混淆这两个概念,数组作为最常见的集合在编程语言中是 ...

  5. PHP零基础入门

    字符函数库: 函数库基础 安装字符串函数库 字符串函数库列表 函数是可以实现特定功能,可以重复执行的代码段. 函数分 内置函数 和 用户函数. 内置函数是指PHP本身提供的各类库函数. 字符串函数库, ...

  6. [Swift]LeetCode352. 将数据流变为多个不相交间隔 | Data Stream as Disjoint Intervals

    Given a data stream input of non-negative integers a1, a2, ..., an, ..., summarize the numbers seen ...

  7. app自动化问题点整理

    1.配置SDK环境发现adb无法生效: 解决方案: 这个问题一般就是你的环境变量没有配置好,很多同学比较容易出现的点就是win10系统的环境变量配置: 一定要注意打开path添加:%ANDROID_H ...

  8. 祝雷(依乐祝):一份来自29岁.NET老程序员的自白

    潘老师的文笔果然了得,经过潘老师的妙笔生花后,文章的阅读体验果然好了很多!这里再次感谢潘老师的支持! 祝雷(合肥.NET 俱乐部发起人) [个人介绍] 博客园知名博主(依乐祝).6年以上.NET技术栈 ...

  9. 利用Grafana展示zabbix数据

    一.系统搭建(以Centos7为例)因为我们的主要目的是展示zabbix的数据,所以建议大家直接在zabbix的服务器上搭建这个系统,亲测两系统无冲突,这样部署的好处是两系统间的数据传输更快,前端展示 ...

  10. 使用Redmine的PHP API时,如何判断需求是否为原子需求

    使用Redmine的PHP API时,如何判断需求是否为原子需求 使用redmine的PHP接口时,怎样才能判断需求是否为原子需求呢,下面给出具体的做法: /** * 判断是否为原子需求, 即是否依然 ...