上周,JavaScript 引擎「V8」的开发团队在该项目官方网站上正式宣布推出最新的 8.0 版本。此次更新的重点主要集中在错误修复及性能改善上,正式的版本将在数周后随着谷歌 Chrome 80 稳定版一块儿发布。git
V8 是谷歌公司推出的开源高性能 JavaScript 引擎,主要用于提高 Web 浏览器内部 JavaScript 脚本执行的性能。V8 经过 C++ 语言编写,主要用在 Chrome 浏览器以及 Node.js 上,实现了对 ECMAScript 与 WebAssembly 的支持,可运行于 Windows 七、macOS 10.12 以及使用 x6四、IA-3二、ARM、MIPS 处理器的 Linux 系统,或更新版本的操做系统环境下。V8 既能够单独运行,也可以内嵌到任何基于 C++ 的应用中。V8 项目开发至今已拥有超过 11 年的历史。程序员
V8 引擎的此次更新,对内存占用量与速度都进行了优化。V8 堆包含了不少东西,例如浮点值、字符串字符、编译代码以及标定值,开发团队发现这些标记值占据了堆的很大一部分空间。github
标定值与系统指针同样大,32 位宽度对应 32 位架构,64 位宽度对应 64 位架构。当开发团队对比 32 位版本与 64 位版本时发现,每一个标记值使用了两倍的堆内存。segmentfault
由于高位能够由低位合成,因此只须要将惟一的低位存储到堆中就能实现下降内存的占用量,平都可节省 40% 堆内存,这一方法被称为「指针压缩」。数组
一般状况下,在优化内存占用的同时也会牺牲部分性能,但通过这一改进以后,在 V8 及其垃圾收集器中却出现了真实网站的性能提高。浏览器
在优化高阶内建上,新版本解除了 TurboFan 优化流程中的一处限制,这处限制使高阶内建没法获得优化。架构
const charCodeAt = Function.prototype.call.bind(String.prototype.charCodeAt); charCodeAt(string, 8);
到目前为止,对 charCodeAt 的调用对 TurboFan 来讲是彻底不透明的,从而引起了对用户定义函数通用调用。经过这一改变,如今能够识别出其实是在调用内置 String.prototype.charCodeAt 函数,从而可以触发 TurboFan 库中的进一步优化来改善对内建的调用,进而得到与如下相同的性能:app
string.charCodeAt(8);
这一变化也会影响到其余一些内建,好比 Function.prototype.apply、Reflect.apply,以及不少其余的高阶数组内建。函数
新版本在 JavaScript 方面出现了两个新特性 ── 可选链和 null 判断合并。性能
在编写属性访问链时,程序员常常须要检查中间值是否为空。没有通过错误检查的链可能会扔出,而通过了明确的错误检查的链是冗长的,而且会产生没必要要的结果,即检查全部的真实值,而不是只检查非空值。
// Error prone-version, could throw.const nameLength = db.user.name.length;// Less error-prone, but harder to read.let nameLength;if (db && db.user && db.user.name) nameLength = db.user.name.length;
可选链(?.)容许程序员编写更精炼、鲁棒性更强的属性访问链,检查中间值是否为空。若是中间值为空,则整个表达式的计算结果为未定义的。
// Still checks for errors and is much more readable.const nameLength = db?.user?.name?.length;
除了静态属性访问外,动态属性访问和调用也能获得支持。
null 合并操做符 ?? 是一个新的用于处理默认值的短路二进制操做符。目前,默认值有时由逻辑 || 操做符处理,以下所示:
function Component(props) { const enable = props.enabled || true; // …}
对 || 的使用,并不适合计算默认值,由于当 a 为非真时 a || b 的结果为 b。若是 props.enabled 明确被设置为假,那么 enable 仍然为真。
经过 null 合并操做符,当 a 为空时,a ?? b 的结果为 b,不然结果为 a。这是理想的默认值行为,并使用 ?? 修正了以前提到的错误。
function Component(props) { const enable = props.enabled ?? true; // …}
null 合并操做符与可选链是相伴而生的特性,可协同工做。当没有任何 props 参数传入时,它们能够对示例进行进一步修改以做为应对。
function Component(props) { const enable = props?.enabled ?? true; // …}
请经过「git log branch-heads/7.9.. ..branch-heads/8.0 include/v8.h」指令来得到接口变化列表。
开发人员目前可经过指令「git checkout -b 8.0 -t branch-heads/8.0」来体验 V8 引擎 8.0 版本中的新特性。
相关项目地址:
高性能 JavaScript 引擎 V8 官方网站
高性能 JavaScript 引擎 V8 GitHub 地址