在最新的 TC39会议上, 我们选择了一些新的功能, 使之成为"ECMAScript 2018语言规范"(ES2018)。 自 ES2017合并以来已达到stage-4的所有提案均获选定。 这篇文章让我们快速了解一下 ES2018的新功能。
Stage-4?
Tc39委员会有5个阶段的进程, 从stage-0到stage-4, 由此发展出一个新的语言特征。 stage-4是「完成」阶段。 第四阶段建议清单可在 GitHub 网站查阅。
Rest/Spread 属性
在析构时, rest / spread 属性允许您将对象的剩余属性收集到新对象中。 把它想象成一块魔法磁铁, 吸引着所有的残羹剩饭。
我自己也经常使用这个方法, 特别是在 React (Native)上下文中, 我可以从this.props
中取出特定的一些值在当前文件中使用,剩下的属性则传递到子组件中。
此外, 如果你稍微转换一下你的思维, rest / spread 属性为您提供了一种很好的方法, 可以让你从一个immutable的对象中删除某个属性。
异步迭代
通过异步迭代, 我们得到了异步迭代器和异步迭代。 异步迭代器就像普通的迭代器一样, 除了它们的next()方法返回一个{value, done}
的promise对象。 为了使用异步迭代器, 我们现在可以在 for... of
循环中使用await
关键字。
Promise.prototype.finally()
Promise.prototype.finally()
完成整个promise的实现, 允许您注册一个回调, 当一个promise完成(要么fulfilled, 要么rejected)时, 可以调用回调函数。
一个典型的用例是在调用fetch()
之后隐藏加载页面: 不用在then()
和catch()
中实现同样的逻辑,而是只要在finally()
中实现就可以。
正则相关特性
总共有4项与 RegExp 相关的建议被纳入 ES2018:
s
(dotAll
) flag for regular expressions- RegExp named capture groups
- RegExp Lookbehind Assertions
- RegExp Unicode Property Escapes
我特别推荐了"RegExp named capture groups"功能, 因为它提高了可读性:
更多关于这些特性的信息可以在 Mathias Bynens (这些提议背后的推动力之一)的博客: ECMAScript regular expressions are getting better!
其他新特性
最重要的是对模板字面量的调整: 当使用标记模板字面量时, 删除了对反义序列的限制, 从而允许像 \xerxes 这样的表达。 在这个调整之前, 这样的写法就会抛出一个错误, 因为 \x 表示十六进制, 而 erxes 不是一个有效的十六进制值。
标记模板字面量
如果用一个表达式来处理模板字符串, 那么这个模板字符串被称为标记模板字面量。 在这种情况下, 标记表达式(通常是函数)会在处理模板字符串的时候被调用, 这就允许你在输出之前可以进行一些特定的操作。
现状如何?
请注意, 并非所有的浏览器都支持这些功能。 Stage-4 意味着它们已经完成, 浏览器供应商应该去实现它们了(一些浏览器已经支持了, 其他的正在进行中)。