You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
const re = /(Dr\. )\w+/g;
const str = 'Dr. Smith and Dr. Anderson';
const matches = str.matchAll(re);
for (const match of matches) {
console.log(match);
}
// logs:
// => ["Dr. Smith", "Dr. ", index: 0, input: "Dr. Smith and Dr. Anderson", groups: undefined]
// => ["Dr. Anderson", "Dr. ", index: 14, input: "Dr. Smith and Dr. Anderson", groups: undefined]
const re = /(Dr\.) \w+/g;
const str = 'Dr. Smith and Dr. Anderson';
let matches;
while ((matches = re.exec(str)) !== null) {
console.log(matches);
}
// logs:
// => ["Dr. Smith", "Dr.", index: 0, input: "Dr. Smith and Dr. Anderson", groups: undefined]
// => ["Dr. Anderson", "Dr.", index: 14, input: "Dr. Smith and Dr. Anderson", groups: undefined]
为了保证可读性,本文采用意译而非直译。
ECMAScript 2015,也称为ES6,是一个花了6年时间完成的主要版本。从那时起,负责ECMAScript标准开发的技术委员会39 (TC39)每年都会发布该标准的新版本。这个年度发布周期简化了这个过程,并使新特性快速可用,JavaScript社区对此表示欢迎。
今年,ECMAScript 2019(简称ES2019)将会发布。 新功能包括
Object.fromEntries()
,trimStart()
,trimEnd()
,flat()
,flatMap()
,symbol对象的description属性,可选的catch
绑定等。好消息是这些功能已经在最新版本的Firefox和Chrome中实现,并且它们也可以被转换,以便旧版浏览器能够处理它们。
1. Object.fromEntries()
在JavaScript中,将数据从一种格式转换为另一种格式非常常见。 为了便于将对象转换为数组,ES2017引入了
Object.entrie()
方法。 此方法将对象作为参数,并以[key,value]
的形式返回对象自己的可枚举字符串键控属性对的数组。 例如:但是如果我们想要做相反的事情并将键值对列表转换为对象呢? 某些编程语言(如Python)为此提供了
dict()
函数。 在Underscore.js
和Lodash中还有_.fromPairs
函数。ES2019引入
Object.fromEntries()
方法为JavaScript带来类似的功能, 此静态方法允许你轻松地将键值对列表转换为对象:如你所见,
Object.fromEntries()
与Object.entries()
所做的事情正好相反。 虽然以前可以实现Object.fromEntries()相同的功能,但它实现方式有些复杂:请记住,传递给
Object.fromEntries()
的参数可以是实现可迭代协议的任何对象,只要它返回一个两元素,类似于数组的对象即可。例如,在以下代码中,
Object.fromEntries()
将Map对象作为参数,并创建一个新对象,其键和对应值由Map中的对给出:Object.fromEntries()
方法对于转换对象也非常有用,思考以下代码:上述代码将对象中的值转换为其平方根。 为此,它首先将对象转换为数组,然后使用
map()
方法获取数组中值的平方根,结果是可以转换回对象的数组。使用
Object.fromEntries()
的另一种情况是处理URL的查询字符串,如本例所示此代码中,查询字符串将传递给
URLSearchParams()
构造函数。 然后将返回值(即URLSearchParams
对象实例)传递给Object.fromEntries()
方法,结果是一个包含每个参数作为属性的对象。Object.fromEntries()
方法目前是第4阶段提案,这意味着它已准备好包含在ES2019标准中。2. trimStart() and trimEnd()
trimStart()
和trimEnd()
方法在实现与trimLeft()
和trimRight()
相同。这些方法目前处于第4阶段,将被添加到规范中,以便与padStart()
和padEnd()
保持一致,来看一些例子:对于Web兼容性,
trimLeft()
和trimRight()
将保留为trimStart()
和trimEnd()
的别名。3. flat() and flatMap()
flat()
方法可以将多维数组展平成一维数组以前,我们经常使用
reduce()
或concat()
来展平多维数组:请注意,如果提供的数组中有空值,它们会被丢弃:
flat()
还接受一个可选参数,该参数指定嵌套数组应该被展平的级别数。 如果未提供参数,则将使用默认值1
:flatMap()
方法将map()
和flat()
组合成一个方法。 它首先使用提供的函数的返回值创建一个新数组,然后连接该数组的所有子数组元素。 来个例子:数组将被展平的深度级别为
1
.如果要从结果中删除项目,只需返回一个空数组:除了正在处理的当前元素外,回调函数还将接收元素的索引和对数组本身的引用。
flat()
和flatMap()
方法目前处于第4阶段。4.Symbol 对象的 description 属性
在创建Symbol时,可以为调试目的向其添加
description
(描述)。有时候,能够直接访问代码中的description
是很有用的。ES2019 中为
Symbol
对象添加了只读属性description
,该对象返回包含Symbol
描述的字符串。5.可选的 catch
try catch
语句中的catch
有时候并没有用,思考下面代码:此代码中的
catch
回调的信息并没有用处。 但这样写是为了避免SyntaxError
错误。 ES2019可以省略catch
周围的括号:另外:ES2020 的 String.prototype.matchAll
matchAll()
方法是ES2020 第4阶段提议,它针对正则表达式返回所有匹配(包括捕获组)的迭代器对象。为了与
match()
方法保持一致,TC39 选择了**“matchAll”**而不是其他建议的名称,例如 “matches” 或 Ruby的 “scan”。看个简单的例子:此正则表达式中的捕获组匹配字符**“Dr”**,后跟一个点和一个空格
。\w+
匹配任何单词字符一次或多次。 并且g
标志指示引擎在整个字符串中搜索模式。之前,必须在循环中使用
exec()
方法来实现相同的结果,这不是非常有效:重要的是要注意尽管
match()
方法可以与全局标志g
一起使用来访问所有匹配,但它不提供匹配的捕获组或索引位置。 比较以下代码:总结
在这篇文章中,我们仔细研究了 ES2019 中引入的几个关键特性,包括
Object.fromEntries()
,trimStart()
,trimEnd()
,flat()
,flatMap()
,symbol
对象的description 属性以及可选的catch
。尽管一些浏览器还没有完全实现这些特性,但可以使用Babel和其他JavaScript转换器,仍然可以在项目中使用它们。
交流
干货系列文章汇总如下,觉得不错点个Star,欢迎 加群 互相学习。
我是小智,公众号「大迁世界」作者,对前端技术保持学习爱好者。我会经常分享自己所学所看的干货,在进阶的路上,共勉!
关注公众号,后台回复福利,即可看到福利,你懂的。
The text was updated successfully, but these errors were encountered: