译者按: 又过了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候选特征:
- 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/