WebAssembly.Table() 构造函数

Baseline 已广泛支持

此功能已非常成熟,可在多种设备和浏览器版本上使用。自 2017 年 10 月以来,它已在各大浏览器中可用。

WebAssembly.Table() 构造函数创建一个新的 Table 对象,该对象具有指定的大小和元素类型,并使用提供的值进行填充。

语法

js
new WebAssembly.Table(tableDescriptor)
new WebAssembly.Table(tableDescriptor, value)

参数

tableDescriptor

一个可以包含以下成员的对象

element

一个字符串,表示要在表中存储的值的类型。它可以是 "anyfunc"(函数)或 "externref"(主机引用)。

initial

WebAssembly 表的初始元素数量。

maximum 可选

WebAssembly 表被允许增长到的最大元素数量。

value 可选

用于填充新分配空间的元素。

异常

  • 如果 tableDescriptor 不是对象,则会抛出 TypeError
  • 如果指定了 maximum 且小于 initial,则会抛出 RangeError
  • 如果 element 不是 引用类型之一,则会抛出 TypeError
  • 如果 value 的类型不是 element 类型,则会抛出 TypeError

示例

创建一个新的 WebAssembly 表实例

下面的示例创建了一个具有 2 个初始元素的 WebAssembly.Table 实例。WebAssembly.Table 的内容使用 WebAssembly 模块进行填充,并可从 JavaScript 访问。查看 实时示例时,请打开开发者控制台以显示下方代码片段中的控制台日志消息。

此示例使用以下参考文件

  1. table2.html:一个包含创建和操作 WebAssembly.Table 的 JavaScript 的 HTML 页面(源代码
  2. table2.wat:一个 WebAssembly 文本格式模块,该模块被转换为二进制格式并由 table2.html 中的 JavaScript 代码导入(源代码

注意: 提供了一个预编译的 WebAssembly 二进制文件 table2.wasm 以供下载。

table2.html 中,我们创建了一个 WebAssembly.Table

js
const tbl = new WebAssembly.Table({
  initial: 2,
  element: "anyfunc",
});

我们可以使用 Table.prototype.get() 来检索索引内容

js
console.log(tbl.length); // a table with 2 elements
console.log(tbl.get(0)); // content for index 0 is null
console.log(tbl.get(1)); // content for index 1 is null

接下来,我们创建一个包含 WebAssembly.Table 的导入对象

js
const importObject = {
  js: { tbl },
};

接下来,我们加载并实例化一个 WebAssembly 模块。table2.wasm 模块定义了一个包含两个函数的表。第一个函数返回 42,第二个函数返回 83

wat
(module
  (import "js" "tbl" (table 2 funcref))
  (func $f42 (result i32) i32.const 42)
  (func $f83 (result i32) i32.const 83)
  (elem (i32.const 0) $f42 $f83)
)

我们使用 WebAssembly.instantiateStreaming() 方法实例化 table2.wasm

js
const instantiating = WebAssembly.instantiateStreaming(
  fetch("table2.wasm"),
  importObject,
);

实例化 table2.wasm 后,tbl 会更新为以下内容:

  • 表的长度仍为 2
  • 索引 0 的内容现在是一个返回 42 的函数
  • 索引 1 的内容现在是一个返回 83 的函数

表的索引 0 和 1 处的项现在是可调用的 导出的 WebAssembly 函数。要调用它们,请注意我们必须在 get() 调用后添加函数调用运算符 ()

js
instantiating.then((obj) => {
  console.log(tbl.length); // 2
  console.log(tbl.get(0)()); // 42
  console.log(tbl.get(1)()); // 83
});

虽然我们正在从 JavaScript 创建和访问 WebAssembly.Table,但同一个 Table 在 WebAssembly 实例内部也是可见和可调用的。

创建一个带值的新的 WebAssembly 表实例

下面的示例创建一个新的 WebAssembly 表实例,包含 4 个元素,并用同一个对象填充

js
const myObject = { hello: "world" };

const table = new WebAssembly.Table(
  {
    element: "externref",
    initial: 4,
    maximum: 4,
  },
  myObject,
);

console.log(myObject === table.get(2)); // true

规范

规范
WebAssembly JavaScript 接口
# dom-table-table

浏览器兼容性

另见