JavaScript 引擎 V8 发布 8.5 版本

栏目: 软件资讯 · 发布时间: 4年前

内容简介:JavaScript 引擎 V8 发布了 8.5 版本(测试阶段),正式版本将在之后随 Chrome 85 一起推出。8.5 版本带来了一些面向开发人员的特性,主要亮点包括: JavaScript Promise.any 和 AggregateError Promise.any 是一...

JavaScript 引擎 V8 发布了 8.5 版本(测试阶段),正式版本将在之后随 Chrome 85 一起推出。8.5 版本带来了一些面向开发人员的特性,主要亮点包括:

JavaScript

Promise.any 和 AggregateError

Promise.any 是一个 Promise 组合器,一旦输入的一个 Promise 满足,它就会解决所产生的 Promise。

const promises = [
  fetch('/endpoint-a').then(() => 'a'),
  fetch('/endpoint-b').then(() => 'b'),
  fetch('/endpoint-c').then(() => 'c'),
];
try {
  const first = await Promise.any(promises);
  // Any of the promises was fulfilled.
  console.log(first);
  // → e.g. 'b'
} catch (error) {
  // All of the promises were rejected.
  console.assert(error instanceof AggregateError);
  // Log the rejection values:
  console.log(error.errors);
}

如果所有输入的 Promise 都被拒绝,则所产生的 Promise 将被 AggregateError 对象拒绝,该对象包含一个 error 属性,该属性保存一个拒绝值数组。

String.prototype.replaceAll

String.prototype.replaceAll 提供了一种简单的方法来替换所有出现的子字符串,而无需创建全局 RegExp。

const queryString = 'q=query+string+parameters';

// Works, but requires escaping inside regular expressions.
queryString.replace(/\+/g, ' ');
// → 'q=query string parameters'

// Simpler!
queryString.replaceAll('+', ' ');
// → 'q=query string parameters'

Logical assignment operators(逻辑赋值运算符)

逻辑赋值运算符是新的复合赋值运算符,它将逻辑运算符 &&、 || 或 ?? 与任务组合在一起

x &&= y;
// Roughly equivalent to x && (x = y)
x ||= y;
// Roughly equivalent to x || (x = y)
x ??= y;
// Roughly equivalent to x ?? (x = y)

与数学和按位复合赋值运算符不同,逻辑赋值运算符仅有条件地执行赋值。

WebAssembly

在所有平台上都提供了 Liftoff

从 V8 v6.9 开始,Liftoff 一直用作 Intel 平台上 WebAssembly 的基准编译器(Chrome 69 在桌面系统上启用了它)。由于担心内存的增加(基线编译器会生成更多代码),因此到目前为止一直将其保留在移动系统中。

经过最近几个月的试验,v8 团队发现大多数情况下的内存增加可以忽略不计,因此最终在所有架构上默认都启用了 Liftoff,从而提高了编译速度,尤其是在 ARM 设备(32 位和 64 位)上。

提供多值(Multi-value)支持

现在,WebAssembly 对多值代码块和函数返回的支持已可以普遍使用。这反映了该提案最近在正式的 WebAssembly 标准中的合并,并得到所有编译层的支持。

例如,现在这是一个有效的 WebAssembly 函数:

(func $swap (param i32 i32) (result i32 i32)
  (local.get 1) (local.get 0)
)

如果导出了该函数,则也可以从 JavaScript 对其进行调用,并返回一个数组:

instance.exports.swap(1, 2);
// → [2, 1]

相反,如果 JavaScript 函数返回数组(或任何迭代器),则可以将其导入并在 WebAssembly 模块内作为多返回函数调用:

new WebAssembly.Instance(module, {
  imports: {
    swap: (x, y) => [y, x],
  },
});
(func $main (result i32 i32)
  i32.const 0
  i32.const 1
  call $swap
)

更重要的是,工具链现在可以使用此功能在 WebAssembly 模块中生成更紧凑、更快的代码。

支持 JS BigInts

已提供 WebAssembly 支持,用于将 WebAssembly I64 值与 JavaScript BigInts 相互转换,并且根据官方标准的最新更改,该支持可用于一般用途。

现在可以从 JavaScript 调用具有 i64 参数和返回值的 WebAssembly 函数,而不会造成精度损失:

(module
  (func $add (param $x i64) (param $y i64) (result i64)
    local.get $x
    local.get $y
    i64.add)
  (export "add" (func $add)))

从 JavaScript,只能将 BigInts 作为 I64 参数传递:

WebAssembly.instantiateStreaming(fetch('i64.wasm'))
  .then(({ module, instance }) => {
    instance.exports.add(12n, 30n);
    // → 42n
    instance.exports.add(12, 30);
    // → TypeError: parameters are not of type BigInt
  });

V8 API

可使用 git log branch-heads/8.4..branch-heads/8.5 include/v8.h 来获取 API 更改列表。

更新说明:https://v8.dev/blog/v8-release-85


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

探索需求

探索需求

章柏幸、王媛媛、谢攀、杰拉尔德・温伯格、唐纳德・高斯 / 章柏幸、王媛媛、谢攀 / 清华大学出版社 / 2004-7-1 / 39.00元

本书将与您一起寻找"什么是客户真正想要的"这一问题的答案。 本书着眼于系统设计之前的需求过程,它是整个开发过程(如何设计人们想要的产品和系统)中最有挑战性的那部分。通过对一些需求分析中的常见误区和问题的分析和讨论,从和客户沟通开始,深入研究一些可能的需求,澄清用户和开发者期望值,最终给出了能够大幅度提高项目成功几率的一些建议方法。 本书由该领域内公认的两位作者合著,搜集了他们在大大小小......一起来看看 《探索需求》 这本书的介绍吧!

JS 压缩/解压工具
JS 压缩/解压工具

在线压缩/解压 JS 代码

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具