资讯专栏INFORMATION COLUMN

ECMASCript 2019可能会有哪些特性?

tuantuan / 699人阅读

摘要:可能不会包括所有的语法提案。事实上,有些提案已经被搁置很多年了。因此,很可能也会在今年月份发布。

译者按: 又过了1年...

原文:What"s New in JavaScript for 2019

译者: Fundebug

为了保证可读性,本文采用意译而非直译。另外,本文版权归原作者所有,翻译仅用于学习。

最近这些年,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候选特性:

globalThis

动态import()

遗留的RegExp特性 features

import.meta

String的matchAll()方法

Object.fromEntries()

规范JSON.stringify

标准化命令行程序的Hashbang

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仓库。

参考

Learn JavaScript in 2019!

The History (and Future) of Asynchronous JavaScript

Build a Secure Node.js Application with JavaScript Async Await Using Hapi

Use TypeScript to Build a Node API with Express

Standard ECMA-262

关于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/

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/108964.html

相关文章

  • Node12有哪些值得关注的新特性

    摘要:再之后会有个月的延长维护期。期间支持的变更严重的,严重的安全问题或者文档更新。已经成为协议的一个重大更新,并且正在积极地在上集成。此外,默认情况下已禁用和,并且库已删除已弃用的函数。 前言 时隔一年,Node.js 12 如约而至,正式发布第一个 Current 版本。它将从2019年10月开始进入长期支持(LTS)版本直到2022年4月。 该版本带来的新特性: V8 更新带来好多不...

    kaka 评论0 收藏0
  • ECMASCRIPT 6 实战之 解构赋值

    摘要:相信解构赋值自以下简称面世以来被大家快速地熟悉并运用到实际开发中了这是一种能有效减少代码量,使代码逻辑更简单优雅的技术下面我们就再来回顾总结一下解构赋值的种种用法吧基本用法从对象解构假设有一个对象,它的结构为以对称的形式从从边的对象中匹配与 相信解构赋值(Destructuring)自 ECMASCRIPT 6(以下简称 ES 6) 面世以来被大家快速地熟悉并运用到实际开发中了, 这是...

    yangrd 评论0 收藏0
  • 除了Oracle JDK,我们还有哪些选择?

    摘要:就在昨天,发布了新版的我相信很多开发人员沉溺在编码的乐趣中,还没注意到相关消息。 就在昨天,Oracle发布了新版的JDK 11,我相信很多Java开发人员沉溺在编码的乐趣中,还没注意到相关消息。 在2017年9月份,Oracle官网发布了一则博客https://blogs.oracle.com/java... 总结来说,主要内容涉及到: 调整JAVA SE的版本发布计划节奏;从JAV...

    李世赞 评论0 收藏0
  • 什么是 JAVASCRIPT?

    摘要:,微软发布,同时发布了,该语言模仿同年发布的。,公司在浏览器对抗中没落,将提交给国际标准化组织,希望能够成为国际标准,以此抵抗微软。同时将标准的设想定名为和两类。,尤雨溪发布项目。,正式发布,并且更名为。,发布,模块系统得到广泛的使用。 前言 作为程序员,技术的落实与巩固是必要的,因此想到写个系列,名为 why what or how 每篇文章试图解释清楚一个问题。 这次的 why w...

    ephererid 评论0 收藏0
  • 前端培训-中级阶段(4)- BOM 浏览器对象模型(2019-07-04期)

    摘要:提供了与浏览器窗口进行交互的对象标签之间不会共享。用于描述当前浏览器的历史记录。表示窗口是否以全屏显示。 前端最基础的就是 HTML+CSS+Javascript。掌握了这三门技术就算入门,但也仅仅是入门,现在前端开发的定义已经远远不止这些。前端小课堂(HTML/CSS/JS),本着提升技术水平,打牢基础知识的中心思想,我们开课啦(每周四)。 前面我们已经基本掌握常规的语法语义,以及基...

    smallStone 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<