ECMASCript 2019可能会有哪些特性?
栏目: JavaScript · 发布时间: 5年前
内容简介:译者按:又过了1年…最近这些年,ECMASCript标准发展节奏非常稳定,每年都会发布新的特性。那么,ECMASCript 2019可能会有哪些特性呢?JavaScript的标准即为
译者按:又过了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、金山软件、百姓网等众多品牌企业。欢迎大家免费试用!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- JDK/Java 16 可能带来什么新特性?
- Java/JDK 13 可能带来什么新特性?
- lua 5.4 可能会增加 to-be-closed 特性
- 你可能知道事务的四大特性,但是你不一定知道事务的实现原理
- 「小得104」大龄程序员可能还不知道的Java中的几个"新"特性
- IPFS:区块链“不可能三角”的可能解 | 万向区块链小课堂
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
你不知道的JavaScript(上卷)
[美] Kyle Simpson / 赵望野、梁杰 / 人民邮电出版社 / 2015-4 / 49.00元
JavaScript语言有很多复杂的概念,但却用简单的方式体现出来(比如回调函数),因此,JavaScript开发者无需理解语言内部的原理,就能编写出功能全面的程序;就像收音机一样,你无需理解里面的管子和线圈都是做什么用的,只要会操作收音机上的按键,就可以收听你喜欢的节目。然而,JavaScript的这些复杂精妙的概念才是语言的精髓,即使是经验丰富的JavaScript开发者,如果没有认真学习也无......一起来看看 《你不知道的JavaScript(上卷)》 这本书的介绍吧!