JavaScript语言规范,也称为ECMAScript或ES,是一个动态文档,每年根据不断变化的需求进行修订。虽然JavaScript最初是一种脚本语言,但ECMAScript规范概述指出该语言“现在用于许多不同上下文和规模的全方位编程任务”。因此,JavaScript被更好地理解为一种功能齐全的通用编程语言。随着ECMAScript2022即将发布,让我们来看看ECMAScript2021中引入的新JavaScript语言特性。String.prototype.replaceAllreplaceAll()方法以字符串或正则表达式(称为模式)作为其第一个争论。第二个参数是模式的替换。给定第一个和第二个参数,replaceAll()返回一个新字符串,它将作为源字符串,其中模式的所有实例都被替换。源字符串不受影响。在ECMAScript2021中,replaceAll()加入ECMAScript2020的matchAll()以改进JavaScript内置String对象的内在功能。replaceAll()方法的工作方式与replace()完全相同,但适用于字符串中所有出现的地方,而不仅仅是第一次出现的地方。在多年不得不使用库或手工编码的解决方案之后,这是一个受欢迎的补充。在示例1中,我给出了一个简单的示例,其中我们修改了莎士比亚的一些作品。例1,replaceAll()letquote="全世界是一个舞台,所有的男人和女人只是演员";letnewQuote=quote.replaceAll("all","mostof");console.log(newQuote);promise.any()promise.any()方法接受一个承诺数组,并允许通过返回一个新的承诺来响应第一个成功实现的承诺。如果任何承诺被拒绝,它们将被忽略。(请注意此方法与promise.all()相比如何,promise.all()在出现任何错误或拒绝时停止;与promise.allSettled()相比,后者让您观察集合中解决的所有承诺,即使存在中间错误。)如果有的话其中一个Promise失败,promise.any()仍将针对集合中第一个已解决的Promise采取行动。如果传递的Promise均未解析,则promise.any()方法返回一个被拒绝的Promise。它返回的错误是AggregateError,这也是ECMAScript2021引入的新错误类型。AggregateError代表遇到的所有错误的汇总。我们可以使用promise.any()将多个Promise聚合为一个。这个承诺将解决首先解决的集合,忽略错误和拒绝。下面是一个简单的例子。示例2,promise.any()-全部解决接下来,我们转到示例3,其中所有Promise最终都会失败,因为它们被拒绝了。constpromise1=newPromise((resolve,reject)=>{setTimeout(resolve,1000,"1second");});constpromise2=newPromise((resolve,reject)=>{setTimeout(resolve,2000,"2second");});让promises=[promise1,promise2];Promise.any(promises).then((firstResolved)=>{console.log(firstResolved);//outputs"1second"})示例3,promise.any()-全部被拒绝在示例3中,我们添加了一个catch处理程序,在两个Promise都被拒绝后触发。请注意,AggregateError是一个对象,其中包含有关失败承诺的信息。constpromise1=newPromise((resolve,reject)=>{setTimeout(reject,1000,"1second");});constpromise2=newPromise((resolve,reject)=>{setTimeout(reject,2000,"2second");});让promises=[promise1,promise2];Promise.any(promises).then((firstResolved)=>{console.log(firstResolved);}).catch((err)=>{console.log("error:"+err)})//输出错误:AggregateError:Allpromiseswererejected让我们仔细看看在AggregateError中,ECMAScript2021的另一个新特性。AggregateErrorAggregateError是一个特殊的错误子类,它将许多错误组合成一个聚合对象。如您所见,功能3中的promise.any()方法创建了一个AggregateError。在此示例中,传递给promise.any()的所有承诺均失败,因此该方法返回AggregateError。errors包含描述错误的消息和包含有关每个错误的详细信息的数组。但是在示例4中显示了返回的错误内容。示例4、AggregateError如上所示,AggregateError可以通过AggregateError.errors访问导致错误的promise消息。AggregateError:Allpromiseswererejectederrors:Array(2)0:"1second"1:"2second"length:2message:"Allpromiseswererejected"stack:"AggregateError:Allpromisesarerejected"新的逻辑赋值操作JavaScript具有熟悉的数学赋值运算符,例如+=,为了方便,它一次执行运算和赋值。ECMAScript2021添加了对逻辑运算符||、??的类似支持和&&。让我们来看看它们中的每一个。空赋值(??=)我们可以使用空赋值运算符来测试变量是否为空或未定义。如果变量为空或未定义,我们可以将表达式的右侧分配给变量。接下来,我们继续看例5中的一个例子。例5.??=实际赋值请注意,当用于现有变量(例如existingQuote)时,空值赋值运算符什么也不做。但是,当用于nonExistingQuote时,它??会为报价分配一个新值。letquote="当善良消失时,道德就存在。";letexistingQuote="当人们几乎不知道他存在时,领导者是最好的";letnonExistingQuote=null;existingQuote??=quote;nonExistingQuote??=quote;console.log(现有报价);//当人们几乎不知道他存在时,领导者是最好的console.log(nonExistingQuote);//当善良消失时,道德就会消失。即使existingQuote的字符串为空(JavaScript中的假值),nullish也不会赋值替换它;它将保持为空字符串。这就是运算符的本质:它只测试null或undefined。赋值(&&=)和赋值运算符(&&=)测试表达式的左侧。如果左侧为真,则赋值表达式的右侧。如果为假,则操作员什么都不做。让我们看一下功能6中的一个简单示例。示例6.赋值运算符(&&=)和赋值运算符(&&=)用在表达式的左侧。如果左侧不为空或未定义,则分配表达式的右侧。如果它是假的,什么也不做。letemptyString="";emptyString&&="bar";console.log(emptyString);//""letnonEmptyString="foo";nonEmptyString&&="bar";console.log(nonEmptyString);//"bar"在特性6中,第一个控制台日志输出一个空字符串。这是因为空字符串是假的,所以&&=运算符不会为其分配新值。第二个控制台输出“bar”。这是因为nonEmptyString是“foo”,这是一个真值。&&=是边缘情况运算符,但在您需要时很有用。或赋值(||=)or赋值运算符与刚才看到的and赋值运算符相反。我们可以使用清单6中的相同示例,这次将&&=替换为||=。例7,||=实际赋值letemptyString="";emptyString||="bar";console.log(emptyString);//"bar"letnonEmptyString="foo";nonEmptyString||="bar";console.log(nonEmptyString);//"foo"如果表达式的左侧为假,||=赋值运算符解析到右侧。因此,在这种情况下,emptyString变为“bar”。nonEmptyString变量保持其真实值“foo”。WeakRefWeakRef用于引用目标对象而不将其从垃圾收集中保存。这是一个相当深奥的语言特性,工作的编码人员很少使用。WeakRefs的一个常见用例是实现大对象的缓存或映射,“不希望大对象仅仅因为它出现在缓存或映射中而保持活动状态。”因此,如果您发现自己正在为大型实体构建缓存解决方案,请记住存在LiveWeakRef。否则,如果您不确定是否需要WeakRef变量引用,则应避免使用它。(规范本身建议避免使用它。)FinalizationRegistryJavaScript几乎在Java弃用Object.finalize()的同时引入了FinalizationRegistry,这在编程上有点讽刺意味。这些特征实际上是相似的。与WeakRef一样,该规范警告开发人员远离用户定义的终结器。但是,对于某些用例,新的FinalizationRegistry可能正是我们所需要的。该规范提供了消耗大量文件句柄的长时间运行进程的示例。在这种情况下,使用FinalizationRegistry可确保没有句柄泄漏。与WeakRef一起,FinalizationRegistry比应用程序开发人员更适合平台和框架开发人员的工具箱。数字文字分隔符是使查看大数字更容易的好方法。JavaScript不能像自然语言那样使用逗号,因为那个符号已经被占用了。因此,ECMAScript2021引入了下划线。第一种输入法:letdistanceToSun=91772000000;第二种输入法:letdistanceToSun=91_772_000_000;但第二种方法更容易阅读。Array.prototype.sort改进这与其说是一个特性,不如说是一个注解。基本上,ECMAScript2021规范更准确地描述了Array.prototype.sort的工作原理。此更改应减少引擎之间的实现差异。以上就是写在最后的全部内容。如果觉得有用,记得点赞关注我,我会把更多有用的内容分享给大家。编程愉快!
