当前位置: 首页 > 科技观察

ECMAScript新版即将来袭,4个精彩功能值得期待

时间:2023-03-12 11:02:58 科技观察

ECMAScript新版本即将到来,4大精彩特性值得期待。2020年可能已经跻身历史上最糟糕的5年之列。所以你不妨忘掉今年,期待2021年会有什么惊喜!是的,明年我们将迎来新版本的ECMAScript(也称为JavaScript)。在这篇文章中,笔者将快速带你了解它是什么。replaceAll字符串方法由来已久,现有的replace方法应该是有效的。如果您不知道,目前String对象的replace方法只会影响找到的第一个匹配项,当然除非您使用正则表达式而不是简单字符串作为第一个参数。这不是一个巨大的改进,更像是一个补充,但仍然值得赞赏。conststr="Thebrownfoxisreallybrown";//不是这样做...constnewStr=str.replace(/brown/g,"White");//你可以这样做...constnewStr=str.replaceAll("brown","White");方法和访问器的隐私修饰符图片来源:unsplash目前还没有听说在隐私方面有任何进展(提案还在第三阶段),但作为未来的尝试,我们将能够;方法和访问器设置可见性。这里的“可见性”我的意思是让它们成为私有的,这意味着我们终于有了保护代码的基本方法,并开始慢慢转向更面向OOP的编码方式(并不是说我们当前的函数式方法有什么问题)。classPerson{constructor(name,birhdate,city){this.name=name;this.birthdate=birthdate;this.city=age;}get#Age(){//returnactualage}#myPrivateMethod(){console.log("您不能在此类之外使用它")}}本质上,您是在使用#字符将方法或访问器设为私有。这个字符也成为名字的一部分,所以如果你想使用上面提到的方法,你可以简单地使用this.#Age或this.#myPrivateMethod()。在这两种情况下,如果您尝试从类外部或什至从扩展类中使用它们,您将得到一个异常(等到您有一个受保护的方法再使用它)。Finalizers和WeakReferences?这两个有趣的工具可以帮助处理内存使用问题,并管理垃圾收集。不过,除非需要特别注意内存使用情况,否则不需要使用这两个工具。请注意,以下两个功能与垃圾收集器的工作方式有关,但仅在一个运行时启用。这意味着编写依赖于非标准安装的业务逻辑很可能会产生意想不到的结果。即使有了这些工具,在使用它们之前你也应该清楚你的目的。(1)弱引用在介绍弱引用之前,先简单介绍一下强引用,让大家了解弱引用的优势。强引用本质上是指向目标的指针,在JavaScript中它只是一个变量,您已将目标分配给该变量。例如:classPerson{constructor(first_name,last_name){this.first_name=first_name;this.last_name=last_name;}}letmyP=newPerson("Fernando","Doglio")以上,myP是一个有效的强引用,直到它不再存在。一旦消除了对对象的所有强引用,垃圾收集器就可以自由销毁该对象并释放其内存用于其他事情。也就是说,在某些情况下,比如下面这种情况,强引用可能会锁定一个目标,使其永远无法释放。classPerson{constructor(first_name,last_name){this.first_name=first_name;this.last_name=last_name;this.sibling=null;}}lastme=newPerson("Fernando","Doglio");lastsibling=newPerson("我的","兄弟姐妹");me.sibling=兄弟姐妹;sibling.sibling=我;在上面的例子中,两个对象相互引用,所以即使me和sibling变量也不在范围内,所以,除去引用,每个对象内部都有对另一个对象的强引用。实际上,这意味着永远不会收集这些对象。这样做非常好,除非您在内存非常小的设备上使用JS。(2)进入弱引用,了解强引用后,弱引用就很容易理解了。弱引用本质上是一种在不影响垃圾收集器行为的情况下保留对对象的引用的方法。在前面的示例中,如果已使用弱引用构造设置同级功能,则可以收集这些对象。弱引用的另一个用例是缓存结构,因为人们不希望缓存对象的内部引用过于活跃。classMyCache{constructor(){this.cache={}}add(key,obj){this.cache[key]=newWeakRef(obj)}get(key){letcachedRef=this.cache[key].deref()if(cachedRef)returncachedRef;returnfalse;}}上面的例子很基础,使用弱引用就这么简单。请记住,如果要访问引用的对象,请使用deref方法。由于这是一个弱引用,所以需要检查deref的返回值,如果是undefined,那么这个对象已经不存在了,否则使用它是安全的(因此get方法中的IF检查)。(3)Finalizers现在,在topcherrie中,finalizers允许您对弱引用对象被垃圾收集这一事实做出反应。同样,这也是一个高度具体的实现,下面是如何使用它:letregistry=newFinalizationRegistry(value=>{console.log("Anobjectwasremoved!Message:",value)})letmyObject={//....}注册表。register(myObject,"myObjectwasdestroyed")本质上就是这里使用了FinalizationRegistry来创建registry,需要回调函数作为参数。每次收集一个对象(之前使用register方法注册)时都会使用此函数。register方法本身是一个重构方法,用于指定要等待的对象,它的第二个参数是在创建注册表时传递给最初定义的回调的值。建议大家谨慎使用这种方法,尤其不要想着用在业务上,但可以考虑在特殊情况下用它来解决一些新奇的问题。Promise.any来源:unsplash在这个版本中,ECMAScript增加了同时处理多个promise的方法。any方法可以运行多个承诺并使用第一个已解决的承诺来解决后续承诺,或者等到所有承诺都失败并返回一个AggregateError对象(它是Error对象的子类)。那么,any和race之间有什么区别?事实上,无论何时承诺实现或失败,种族都会解决并返回价值。但是,any会以第一个结算值结算,或者等待所有值都失败,然后一起恢复所有错误。constpromise1=Promise.reject(0);constpromise2=newPromise((resolve)=>setTimeout(resolve,100,'quick'));constpromise3=newPromise((resolve)=>setTimeout(resolve,500,'slow'));constpromises=[promise1,promise2,promise3];Promise.race(promises).then((value)=>console.log(value));//logstherejectedpromise//vsPromise.any(promises).then((value)=>console.log(value));//logs"quick"注意any实际上忽略了第一个被拒绝的promise,因为还有其他的promise正在解决,这是race和any的主要区别。ECMAScript2021的新特性不多,但是公认的特性在我看来已经很不错了!使用Wea??kRef和FinalizationRegistry时要小心。它们的功能非常有趣,但在不同的操作条件下它们的结果或行为可能会有所不同。相同的。您最喜欢的新功能是什么?您最期待本次发布的内容是什么?