ECMASCript 2019能够会有哪些特征?

译者按: 又过了1年…

为了保证可读性,本文采纳意译而非直译。别的,本文版权归原作者一切,翻译仅用于进修。

近来这些年,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、金山软件、百姓网等浩瀚品牌企业。迎接人人免费试用

《ECMASCript 2019能够会有哪些特征?》

版权声明

转载时请说明作者Fundebug以及本文地点:
https://blog.fundebug.com/2019/01/30/what-is-new-in-javascript-for-2019/

    原文作者:Fundebug
    原文地址: https://segmentfault.com/a/1190000018063348
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞