简介

ES12是ECMA协会在2021年6月发行的一个版本,因为是ECMAScript的第十二个版本,所以也称为ES12.

ES12发行到当初曾经有一个月了,那么ES12有些什么新个性和不一样的中央呢?一起来看看吧。

基本上ES12引入了replaceAll办法用于对String进行操作,Promise.any用于对Promise进行组合操作,AggregateError用于示意多个谬误的汇合,新的逻辑操作符??=, &&=, ||=,弱援用WeakRef,FinalizationRegistry用于垃圾回收的注册,一个数字的分隔符1_000,更加精准的数组sort办法Array.prototype.sort。

上面本文将会一一进行解说。

replaceAll

相熟java的敌人应该都晓得,java中有两个进行字符串替换的办法,别离是replace和replaceAll,他们的区别在于replace是替换字符串,而replaceAll是进行正则表达式匹配。

然而在javascript中两者的涵义有所不同,在JS中replace是替换第一个呈现的字符串,而replaceAll就是字面上的意思替换所有的字符串,咱们举个例子:

const string="flydean is a good fly"console.log(string.replace("fly", "butterfly"));

下面的值返回:

butterflydean is a good fly

如果改用replaceAll:

const string="flydean is a good fly"console.log(string.replaceAll("fly", "butterfly"));butterflydean is a good butterfly

公有办法

自从JS有了类的概念之后,就能够在类中定义方法,并通过实例化之后的类进行调用,如下所示:

class Student {  getAge() {    console.log("永远18岁")  }}student= new Student();student.getAge();

下面代码运行后果:

"永远18岁"

然而如果咱们不心愿getAge()办法间接裸露给内部应用,也就是说心愿getAge()是一个公有办法,那么只须要在办法后面加上#即可。

class Student {  #getAge() {    console.log("永远18岁")  }}student= new Student();student.getAge();

同样运行,那么会失去上面的谬误提醒:

Error: student.getAge is not a function

怎么解决呢?咱们晓得公有办法是能够在办法外部调用的,那么只须要创立一个私有办法,而后在这个私有办法中调用公有办法即可,如下所示:

class Student {  #getAge() {    console.log("永远18岁")  }    getPublicAge(){    this.#getAge();  } }student= new Student();student.getPublicAge();

咱们能够失去同样的后果。

公有属性

下面讲到了公有办法,那么对于公有属性是怎解决的呢?

通常,对于属性,咱们能够以get修饰符来进行润饰,而后就能够间接通过属性名来拜访了:

class Student {  get Age() {    return 18;  } }student= new Student();console.log(student.Age);

后果咱们会失去18这个输入。

同样,能够在属性名后面加上#,让其变成公有变量,如下所示:

class Student {  get #Age() {    return 18;  } }student= new Student();console.log(student.Age);

下面代码将会输入undefined。

要想拜访上述的公有属性,则能够用私有属性去调用公有属性办法:

class Student {  get #Age() {    return 18;  }   get publicAge() {    return this.#Age  }}student= new Student();console.log(student.publicAge);

十分好用。

Promise.any() 和 AggregateError

promise.any能够返回任意一个提前resolve的后果,在事实的利用中,这种状况是十分常见的,咱们来模仿一个例子:

const prom1 = new Promise((resolve, reject) => {  setTimeout(    () => resolve("promise one"),    Math.floor(Math.random() * 100)  );});const prom2 = new Promise((resolve, reject) => {  setTimeout(    () => resolve("promise two"),    Math.floor(Math.random() * 100)  );});const prom3 = new Promise((resolve, reject) => {  setTimeout(    () => resolve("promise three"),    Math.floor(Math.random() * 100)  );});(async function() {  const result = await Promise.any([prom1, prom2, prom3]);  console.log(result); })();

上述代码能够随机输入promise one,promise two,promise three。

如果将上述代码改成所有的都reject,那么会抛出AggregateError:

const prom1 = new Promise((resolve, reject) => {  setTimeout(    () => reject("promise one rejected"),    Math.floor(Math.random() * 100)  );});const prom2 = new Promise((resolve, reject) => {  setTimeout(    () => reject("promise two rejected"),    Math.floor(Math.random() * 100)  );});const prom3 = new Promise((resolve, reject) => {  setTimeout(    () => reject("promise three rejected"),    Math.floor(Math.random() * 100)  );});try{(async function() {  const result = await Promise.any([prom1, prom2, prom3]);  console.log(result); })();} catch(error) {  console.log(error.errors);}

报的错如下:

Uncaught (in promise) AggregateError: No Promise in Promise.any was resolved
留神,必须是所有的promise都被reject之后才会抛出AggregateError,如果有局部胜利,那么将会返回胜利的后果。

数字分隔符

这个新个性是为了不便程序员看代码而呈现的,如果数字比拟大,那么看起来就不是那么高深莫测,比方上面的长数字:

const number= 123456789;

一眼看不出这个数字的体量到底是多大,所以ES12提供了数字分隔符_。

分隔符不仅能够宰割十进制,也能够宰割二净值或者十六净值的数据,十分好用。

const number = 1_000_000_000_000;const binary = 0b1010_0101_1111_1101;const hex = 0xAF_BF_C3;

下面例子别离代表了十进制,二进制和十六进制的数据,十分直观好用。

新的逻辑操作符

咱们晓得&& 和 || 是被来进行逻辑操作的运算符。

比方:

1 && 2 1 || 2 

等操作,ES12提供了&& 和||的二元操作符,如下:

var x = 1;var y = 2;x &&= y;x ||= y;

另外还提供了??的二元操作符,如:

var x;var y = 2;x ??= y;

下面代码的意思是,判断x是不是空,如果是空那么将y的值赋给x。

总结

ES12的几个新个性还是挺实用的,大家能够尝试一下。

本文已收录于 http://www.flydean.com/ecmascript-12/

最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!

欢送关注我的公众号:「程序那些事」,懂技术,更懂你!