跳到主要内容

V8 发布 v5.1

· 阅读需 3 分钟
V8 团队

V8 发布流程 的第一步是在 Chromium 分支出 Chrome Beta 里程碑之前(大约每六周一次)从 Git 主分支创建一个新分支。我们最新的发布分支是 V8 v5.1,它将在 beta 版中保持一段时间,直到与 Chrome 51 稳定版一起发布一个稳定版本。以下是这个 V8 版本中的新开发者功能亮点。

改进的 ECMAScript 支持​

V8 v5.1 包含了一些针对符合 ES2017 草案规范的改动。

Symbol.species​

诸如 Array.prototype.map 的数组方法会使用子类实例作为其输出,可以选择通过更改 Symbol.species 来定制此行为。类似的改动也应用于其他内置类。

instanceof 定制​

构造函数可以实现自己的 Symbol.hasInstance 方法,以覆盖默认行为。

迭代器关闭​

在 for-of 循环(或其他内置迭代,如 扩展操作符)中创建的迭代器现在会检查关闭方法,当循环提前终止时将调用该方法。这可以在迭代完成后用于清理。

RegExp 子类化 exec 方法​

RegExp 子类可以覆盖 exec 方法,以更改核心匹配算法,并保证它被高层函数如 String.prototype.replace 调用。

函数名称推断​

现在为函数表达式推断的函数名称通常会在函数的 name 属性中提供,遵循 ES2015 正式化的规则。这可能会改变现有的堆栈跟踪,并提供与之前 V8 版本不同的名称。这还为具有计算属性名的属性和方法提供了有用的名称:

class Container {
...
[Symbol.iterator]() { ... }
...
}
const c = new Container;
console.log(c[Symbol.iterator].name);
// → '[Symbol.iterator]'

Array.prototype.values​

类似于其他集合类型,Array 上的 values 方法返回一个数组内容的迭代器。

性能改进​

V8 v5.1 还针对以下 JavaScript 功能带来了显著的性能改进:

  • 执行如 for-in 的循环
  • Object.assign
  • Promise 和 RegExp 实例化
  • 调用 Object.prototype.hasOwnProperty
  • Math.floor, Math.round 和 Math.ceil
  • Array.prototype.push
  • Object.keys
  • Array.prototype.join 和 Array.prototype.toString
  • 展平重复字符串,例如 '.'.repeat(1000)

WebAssembly (Wasm)​

V8 v5.1 初步支持 WebAssembly。你可以在 d8 中通过 --expose_wasm 标志启用它。或者你可以使用 Chrome 51(Beta 频道)试用 Wasm 演示。

内存​

V8 实现了更多的 Orinoco 片段:

  • 并行年轻代撤离
  • 可扩展记忆集合
  • 黑色分配

这样减少了卡顿并在需要时降低内存消耗。

V8 API​

请查看我们的 API更改总结。此文档在每次主要发布几周后会定期更新。

拥有 活动的 V8 检出 的开发者可以使用 git checkout -b 5.1 -t branch-heads/5.1 来尝试 V8 v5.1 的新功能。或者,你也可以 订阅 Chrome 的 Beta 频道,尽快亲自试用这些新功能。