ECMASCript 2019可能会有哪些特性?
栏目: JavaScript · 发布时间: 7年前
内容简介:译者按:又过了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:区块链“不可能三角”的可能解 | 万向区块链小课堂
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Web Design Handbook
Baeck, Philippe de 编 / 2009-12 / $ 22.54
This non-technical book brings together contemporary web design's latest and most original creative examples in the areas of services, media, blogs, contacts, links and jobs. It also traces the latest......一起来看看 《Web Design Handbook》 这本书的介绍吧!