简介ES12是ECMA协会在2021年6月发布的一个版本,因为是ECMAScript的第十二版,所以也被称为ES12。ES12已经发布一个月了那么,ES12有哪些新特性和不同之处呢?一起来看看吧。基本上ES12引入了replaceAll方法来对String进行操作,Promise.any来组合对Promise的操作,AggregateError来表示多个错误的集合,以及新的逻辑运算符??=,&&=,||=,对WeakRef的弱引用,垃圾回收注册的FinalizationRegistry,一个数字分隔符1_000,一个更精确的数组排序方法Array.prototype.sort。下面的文章将一一讲解。replaceAll熟悉java的朋友应该都知道,java中的字符串替换有两种方法,分别是replace和replaceAll。它们的区别在于replace替换字符串,而replaceAll进行正则表达式匹配。但是在javascript中,两者的含义是不一样的。在JS中,replace替换第一个出现的字符串,而replaceAll字面上替换所有字符串。举个例子:conststring="flydeanisagoodfly"console.log(string.replace("fly","butterfly"));上面的值返回:butterflydeanisagoodflyifreplaceAll:conststring="flydeanisagoodfly"console.log(string.replaceAll("fly","butterfly"));butterflydeanisagoodbutterflyprivatemethodSinceJS有类的概念,可以在类中定义方法,通过实例化的类调用,如下所示:classStudent{getAge(){console.log("永远18岁")}}student=newStudent();学生.getAge();上面代码运行的结果:“永远18岁”但是如果我们不想getAge()方法直接暴露给外部使用,也就是说,如果你想让getAge()是一个私有方法,你只需要在方法前添加#。classStudent{#getAge(){console.log("永远18岁")}}student=newStudent();student.getAge();同样运行,那么你会得到如下错误信息:Error:student.getAgeisHowtodealwithnotafunction?我们知道在方法内部可以调用私有方法,所以我们只需要创建一个公共方法,然后在这个公共方法中调用私有方法,如下所示:classStudent{#getAge(){console.log("永远18")}getPublicAge(){this.#getAge();}}student=newStudent();学生.getPublicAge();我们可以得到相同的结果。上面说了私有属性私有方法,那么私有属性怎么处理呢?通常,对于属性,我们可以用get修饰符来修饰,然后我们可以直接通过属性名来访问:classStudent{getAge(){return18;}}student=newStudent();console.log(student.Age);结果,我们将得到18的输出。同样,您可以在属性名称前添加#,使其成为私有变量,如下所示:classStudent{get#Age(){return18;}}student=newStudent();console.log(student.Age);上面的代码会输出undefined。要访问上述私有属性,可以使用公共属性调用私有属性方法:classStudent{get#Age(){return18;}getpublicAge(){returnthis.#Age}}student=newStudent();console.log(student.publicAge);非常有用。Promise.any()和AggregateErrorpromise.any可以返回任何早期解析结果。在实际应用中,这种情况很常见。让我们模拟一个例子:constprom1=newPromise((resolve,reject)=>{setTimeout(()=>resolve("promiseone"),Math.floor(Math.random()*100));});constprom2=newPromise((resolve,reject)=>{setTimeout(()=>resolve("promisetwo"),Math.floor(Math.random()*100));});constprom3=newPromise((resolve,reject)=>{setTimeout(()=>resolve("promisethree"),Math.floor(Math.random()*100));});(asyncfunction(){constresult=awaitPromise.any([prom1,prom2,prom3]);console.log(result);})();以上代码可以随机输出承诺一、承诺二、承诺三。如果上面的代码改成allreject,那么会抛出AggregateError:constprom1=newPromise((resolve,reject)=>{setTimeout(()=>reject("promiseonerejected"),Math.floor(Math.random()*100));});constprom2=newPromise((resolve,reject)=>{setTimeout(()=>reject("promisetworejected"),Math.floor(Math.random()*100));});constprom3=newPromise((resolve,reject)=>{setTimeout(()=>reject("promise3rejected"),Math.floor(Math.random()*100));});try{(asyncfunction(){constresult=awaitPromise.any([prom1,prom2,prom3]);console.log(result);})();}catch(error){控制台。log(error.errors);}报错如下:Uncaught(inpromise)AggregateError:NoPromiseinPromise.anywasresolved注意AggregateError只有在所有promises都被reject后才能被rejected。如果其中一些成功,则将返回成功的结果。数字分隔符的新特性是为了方便程序员阅读代码。如果数字比较大,就不会那么一目了然了,比如下面这个长数字:constnumber=123456789;这个数字的体积一眼看不出有多大,所以ES12提供了数字分隔符_。分隔符不仅可以分隔十进制,还可以分隔二进制值或十六进制值的数据,非常好用。常量编号=1_000_000_000_000;常量二进制=0b1010_0101_1111_1101;十六进制常量=0xAF_BF_C3;以上例子分别表示十进制、二进制和十六进制数据,非常直观易用。新逻辑运算符我们知道&&和||是用于逻辑运算的运算符。例如:1&&21||2等操作,ES12提供了&&和||的二元运算符,如下:varx=1;vary=2;x&&=y;x||=y;??的二元运算符提供,如:varx;变量y=2;X??=是;上面代码的意思是判断x是否为空,如果为空则将y的值赋给x。总结ES12的几个新特性还是挺实用的,大家可以试试。本文已收录于http://www.flydean.com/ecmascript-12/最流行的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等你来发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!
