ES2019规范是对JavaScript的一个小扩展,但仍然带来了一些有趣的特性。本文向您展示八个ES2019特性,可以让您的开发更轻松。String.prototype.trimStart()和String.prototype.trimEnd()有时候我们在处理字符串的时候需要处理多余的空格。ES2020增加了两个函数:.trimStart()和trimEnd()方法可以帮助您处理这些琐事。它们都可以帮助您修剪或删除给定字符串中的空格。trimStart()删除字符串开头的所有空格。trimEnd()将删除字符串末尾的所有空格。但是如果你想去掉两边的空格怎么办?有两种选择。第一种是同时使用ES2019的两个特性。第二种是使用另一种字符串方法trim()。这两种方式都会给你想要的结果。//String.prototype.trimStart()示例//处理不带空格的字符串:'JavaScript'.trimStart()//Output://'JavaScript'//处理以空格开头的字符串:'JavaScript'.trimStart()//Output://'JavaScript'//String'JavaScript'两边都有空格.trimStart()//Output://'JavaScript'//String'JavaScript'以空格结尾。trimStart()//Output://'JavaScript'//String.prototype.trimEnd()example://处理不带空格的字符串:'JavaScript'.trimEnd()//Output://'JavaScript'///句柄以空格开头的字符串:'JavaScript'.trimEnd()//Output://'JavaScript'//两边都有空格的字符串'JavaScript'.trimEnd()//Output://'JavaScript'//空格终止string'JavaScript'.trimEnd()//Output://'JavaScript'Function.prototype.toString()函数的toString()方法已经有一段时间了。它的作用是允许您打印函数的代码。ES2019在处理注释和特殊字符(如空格)的方式上有所不同。过去,toString()方法会去除注释和空格。因此函数的打印版本可能看起来与原始代码不同。ES2019将不再发生这种情况。它返回的值将与原始值匹配,包括注释和特殊字符。//ES2019之前:functionmyFunc/*isthisreallygoodname?*/(){/*现在,怎么办?*/}myFunc.toString()//Output://"functionmyFunc(){}"//ES2019:functionmyFunc/*isthisreallygoodname?*/(){/*现在,做什么?*/}myFunc.toString()//Output://"functionmyFunc/*isthisreallygoodname?*/(){//*现在,做什么?*///}“Array.prototype.flat()和Array.prototype.flatMap()数组是JavaScript的基本构建块之一。它们有时会引起很多问题。当您必须处理多维数组时尤其如此。即使是将多维数组转换为一维这一看似简单的任务也可能很困难。好消息是ES2019的两个特性使这更容易。第一个是flat()方法。当用于多维数组时,它会转换为一维。默认情况下,flat()只会将数组展平一层。但是页面可以指定层数并在调用时将其作为参数传递。如果您不确定需要多少级别,也可以使用Infinity。//创建数组:constmyArray=['JavaScript',['C','C++',['Assembly',['Bytecode']]]]//平铺一层:letmyFlatArray=myArray.flat(1)//Output:console.log(myFlatArray)//Output://['JavaScript','C','C++',['Assembly',['Bytecode']]]//用参数Infinity展开:letmyInfiniteFlatArray=myArray.flat(Infinity)//输出:console.log(myInfiniteFlatArray)//输出://['JavaScript','C','C++','Assembly','Bytecode']Array.prototype.flatMap()中除了flat()方法,还有flatMap()。将其视为flat()的高级版本。不同之处在于flatMap()方法结合了flat()和map()。当数组被展平时可以调用回调函数。这使得在展平过程中使用原始数组中的每个元素成为可能。在修改数组内容的同时展平数组时很方便。//创建一个数组:constmyArray=['Oneword','Twowords','Threewords']//使用map()将数组中的所有字符串拆分为单词://注意:这将创建一个多维数组。constmyMappedWordArray=myArray.map(str=>str.split(''))console.log(myMappedWordArray)//输出://[['一','字'],['二','字'],['Three','words']]//flatMap()示例:constmyArray=['Oneword','Twowords','Threewords']//使用map()将数组中的所有字符串拆分为单词://注意:这将创建一个多维数组。constmyFlatWordArray=myArray.flatMap(str=>str.split(''))console.log(myFlatWordArray)//输出://['一','字','二','字','三','words']Object.fromEntries()当需要将对象转换为数组时,可以使用entries()来完成。但是反过来做就很难了。ES2019提供了fromEntries()来轻松解决这个问题。这个方法的作用很简单。它采用可迭代的键值对,例如数组或Map,并将其转换为对象。//将数组转换为对象//创建数组:constmyArray=[['name','Joe'],['age',33],['favoriteLanguage','JavaScript']]constmyObj=Object.fromEntries(myArray)console.log(myObj)//Output://{//name:'Joe',//age:33,//favoriteLanguage:'JavaScript'////将Map转换为对象://createmap:constmyMap=newMap([['name','Spike'],['species','dog'],['age',3]])constmyObj=Object.fromEntries(myMap)console.log(myObj)//Output://{//name:'Spike',//species:'dog',//age:3//}可选的catchbinding在使用try...catch之前,还必须使用binding当然。即使不使用异常,也必须将其作为参数传递。在ES2019中,如果不想使用异常,可以使用不带参数的catch块。//ES2019之前:try{//Dosomething.}catch(e){//忽略需要的e参数//如果不想用,也应该保留。}//ES2019:try{//Dosomething.}catch{//不需要添加任何参数}Well-formedJSON.stringify()过去,当在包含特定字符的东西上使用JSON.stringify()时,你会获取格式不正确的Unicode字符串。从U+D800到U+DFFF的编码段将变为“?”。更糟糕的是,没有办法将这些错误的字符改回原来的字符。ES2019修复了JSON.stringify()方法。现在可以对那些有问题的代码片段进行分类,并将它们转换回其原始表示形式。Symbol.prototype.description是ES2015(ES6)中引入的新数据类型。它们通常用于标识对象属性。ES2019增加了description属性。此属性是只读的,其值无法更改。它用于返回给定符号的描述。有两件事要记住。首先,创建符号时描述不是强制性的,而是可选的。因此,当您尝试访问描述时,您可能会得到任何未定义的内容。如果你试图在没有描述的情况下访问符号描述,你将得到未定义(undefined)。第二点,描述是对符号本身的描述。它不是符号的标识符。这意味着您不能使用现有描述(即描述属性的值)来访问现有符号。这只是为了更容易识别您正在使用的符号。说明:创建新符号时,您可以通过将一些字符串作为参数传递给Symbol()对象来添加说明。如果留空,说明将是未定义的。//创建带有描述的符号://创建符号并添加描述://注意:描述为“Myfirstsymbol”。constmySymbol=Symbol('Myfirstsymbol.')//输出描述属性的值:console.log(mySymbol.description)//输出://'Myfirstsymbol.'//读取不存在的Symbol:console.log(Symbol().description)//Output://undefined//读取定义为空字符串的描述:console.log(Symbol('').description)//Output://''Symbol.prototype.toString()toString()方法提供了另一种读取符号描述的方法。它的缺点是在返回的字符串中包含Symbol()。另一个区别是toString()方法永远不会返回不存在的未定义描述。使用描述的另一个原因:如果你有一个没有描述的符号并使用toString()方法,你仍然会得到Symbol()部分。如果描述是一个空字符串,你也会得到这个。这使得基本上无法区分不存在的描述和用作描述的空字符串。//创建一个带有描述的Symbol:constmySymbol=Symbol('REAMDE.')//输出描述属性的值:console.log(mySymbol.toString())//Output://'Symbol(REAMDE.)'//读取一个不存在的Symbol:console.log(Symbol().toString())//Output://'Symbol()'//读取一个定义为空字符串的描述:console.log(Symbol('').toString())//输出://'Symbol()'
