上周,JavaScript 引擎「V8」的开发团队在该项目官方网站上正式宣布推出最新的 8.0 版本。这次更新的重点主要集中在错误修复及性能改善上,正式的版本将在数周后随着谷歌 Chrome 80 稳定版一起发布。

V8 是谷歌公司推出的开源高性能 JavaScript 引擎,主要用于提升 Web 浏览器内部 JavaScript 脚本执行的性能。V8 通过 C++ 语言编写,主要用在 Chrome 浏览器以及 Node.js 上,实现了对 ECMAScript 与 WebAssembly 的支持,可运行于 Windows 7、macOS 10.12 以及使用 x64、IA-32、ARM、MIPS 处理器的 Linux 系统,或更新版本的操作系统环境下。V8 既可以单独运行,也能够内嵌到任何基于 C++ 的应用中。V8 项目开发至今已拥有超过 11 年的历史。

性能

指针压缩

V8 引擎的这次更新,对内存占用量与速度都进行了优化。V8 堆包含了很多东西,例如浮点值、字符串字符、编译代码以及标定值,开发团队发现这些标记值占据了堆的很大一部分空间。

标定值与系统指针一样大,32 位宽度对应 32 位架构,64 位宽度对应 64 位架构。当开发团队对比 32 位版本与 64 位版本时发现,每个标记值使用了两倍的堆内存。

因为高位可以由低位合成,所以只需要将唯一的低位存储到堆中就能实现降低内存的占用量,平均可节省 40% 堆内存,这一方法被称为「指针压缩」。

通常情况下,在优化内存占用的同时也会牺牲部分性能,但经过这一改进之后,在 V8 及其垃圾收集器中却出现了真实网站的性能提升。

优化高阶内建

在优化高阶内建上,新版本解除了 TurboFan 优化流程中的一处限制,这处限制使高阶内建无法得到优化。

const charCodeAt = Function.prototype.call.bind(String.prototype.charCodeAt);charCodeAt(string, 8);

到目前为止,对 charCodeAt 的调用对 TurboFan 来说是完全不透明的,从而引发了对用户定义函数通用调用。通过这一改变,现在可以识别出实际上是在调用内置 String.prototype.charCodeAt 函数,从而能够触发 TurboFan 库中的进一步优化来改善对内建的调用,进而获得与以下相同的性能:

string.charCodeAt(8);

这一变化也会影响到其他一些内建,比如 Function.prototype.apply、Reflect.apply,以及很多其他的高阶数组内建。

JavaScript

新版本在 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 合并

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; // …}

V8 应用程序接口

请通过「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 版本中的新特性。

SegmentFault 思否编辑部编译。

javascript最新版本_JavaScript 引擎「V8」发布 8.0 版本,内存占用量大幅下降相关推荐

  1. 「biáng biáng 面」马上可以打出来了!Unicode发布13.0版本,收录4939个生僻字

    点击上方"AI遇见机器学习",选择"星标"公众号 重磅干货,第一时间送达 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 有一种面条,很多人吃过,但 ...

  2. 开源微服务运行时 Dapr 发布 1.0 版本

    作者 | Dapr 社区 译者 | 敖小剑 来源|阿里巴巴云原生公众号 Dapr 是 2019 年 10 月开源的分布式运行时.早在 Dapr 开源初期,阿里云就开始参与 Dapr 社区建设和代码开发 ...

  3. 路遥工具箱全面迁移至 .NET 6.0 并发布 3.0 版本及迁移记录详解

    随着 .NET 6.0 的发布 NewLife 组件也进行了升级,并在 2022 年 1 月份全面停止了对 .NET Framework 的支持框架依赖升级至 .NET Standard 2.1 . ...

  4. Rust即将发布1.0版本,Go持续获得关注:如何在新生语言之间做出抉择

    没有什么比谈论一门新语言能够让程序员更加兴奋.更加固执己见的了.作为两枚冉冉升起的新星,Go和Rust让我们置身在这场旋窝之中.作为灵感相似但是动机与目标完全不同的两门语言,Go和Rust可谓都是出身 ...

  5. CAP 发布 5.0 版本正式发布

    前言 今天,我们很高兴宣布 CAP 发布 5.0 版本正式版.同时我们也很高兴的告诉你 CAP 已经有越来越多的用户并且变得越来越流行. 在 5.0 版本中,我们主要致力于更好的支持 .NET 5 以 ...

  6. harmonyos pc,华为鸿蒙系统(HarmonyOS)9月11日发布2.0版本将打通PC、手表和车机等产品终...

    原标题:华为鸿蒙系统(HarmonyOS)9月11日发布2.0版本将打通PC.手表和车机等产品终 据国内媒体报道,华为鸿蒙系统(HarmonyOS)将于今年9月11日举行的华为开发者大会上发布2.0版 ...

  7. 详解 Chrome 「V8 」引擎,让你更懂JavaScript !

    今天来聊聊 V8,它的主要职责是用来执行 JavaScript 代码的.在正式全面了解 V8 之前,先来了解下「JavaScript 的基本特性和设计思想」. 1.JavaScript 的基本特性和设 ...

  8. 最新华为鸿蒙手机,「连接」万物的鸿蒙,能拯救华为手机吗?

    在曝光两年之后,华为的鸿蒙系统终于正式和用户见面了. 6 月 2 日,华为鸿蒙操作系统及华为全场景新品发布会开启,正式推出 HarmonyOS 2.0,并发布了多款搭载鸿蒙 2.0 的新品.这也意味着 ...

  9. Android 解锁app,应用锁「AppLock」v3.3.0 for Android 完美解锁版

    摘要 一款可以有效保护您应用.图片.视频等隐私的应用 随着我们的手机越来越智能,我们的隐私也同样一一的都储存在了里面,于是隐私安全就成为了重中之重的大事.恩!您可以考虑试试今天这款应用锁「AppLoc ...

最新文章

  1. GitHub 遭抵制!AI 代码生成神器竟成“抄袭工具”?
  2. os.path.join
  3. 【openCV学习笔记】在Mac上配置openCV步骤详解
  4. JavaScript 实现块级作用域
  5. NS2安装笔记---SUSE Linux
  6. .net 后台 下载 图片_特殊的 “图片软件” !
  7. 创建python虚拟环境
  8. SharePoint2010部署(一)---数据库的安装
  9. JAVA 集合Null 初始化_springboot使用mybatis-plus表单更新null值问题通用解决方案
  10. Spark Client启动原理探索
  11. 解决华为手机Android系统10.0不能隐藏桌面图标问题,全网唯一
  12. win 64 安装 sql server 2000、出现挂起 解决
  13. Zabbix proxy
  14. gnuradio+b210实现FM收音机
  15. C/C++ GBK2312转Unicode
  16. oppor829t如何刷机_oppo R829t (R1 移动版)一键救砖教程,轻松刷回官方系统
  17. 2021年自动化预推免面试经历记录与总结--持续更新
  18. 计算机与汽车智能信息化管理,谈计算机控制系统在汽车行业的应用
  19. [OpenCv]简单摄像头监控Demo
  20. Android切面编程(AOP)详解

热门文章

  1. drupal显示图片_Drupal在多样性和包容性方面显示领导力
  2. opensource项目_最佳Opensource.com:编程
  3. blender使用_使用Blender准备骨科手术
  4. 字扩展,位扩展,和字位扩展_6个有用的LibreOffice扩展
  5. 第二十三章:准备原材料
  6. Bootstrap列表组禁用和活动状态
  7. 客户端脚本selectivizr,PIE,Respond.js
  8. es6 SharedArrayBuffer对象
  9. 四.因子图优化学习---对因子图优化的粗浅理解
  10. matlab ga函数,matlab遗传算法ga函数