WebAssembly.Table

Baseline 已廣泛支援

此功能已非常成熟,可在多種裝置和瀏覽器版本上使用。自 2017 年 10 月以來,它已在各大瀏覽器中可用。

WebAssembly.Table 物件是一個 JavaScript 包裝器物件 — 一個類陣列結構,代表一個 WebAssembly 表,它儲存同質的引用。由 JavaScript 或 WebAssembly 程式碼建立的表將可以在 JavaScript 和 WebAssembly 中訪問和修改。

注意:目前表只能儲存函式引用或宿主引用,但未來可能會擴充套件。

建構函式

WebAssembly.Table()

建立一個新的 Table 物件。

例項屬性

Table.prototype.length 只讀

返回表的長度,即表中元素的數量。

例項方法

Table.prototype.get()

訪問器函式 — 獲取儲存在給定索引處的元素。

Table.prototype.grow()

透過指定數量的元素來增加 Table 例項的大小。

Table.prototype.set()

將給定索引處的元素設定為給定值。

示例

建立一個新的 WebAssembly 表例項

下面的示例(請參閱 table2.html 的 原始碼即時版本)建立了一個初始大小為 2 個元素的新的 WebAssembly 表例項。然後,我們打印出表長度和兩個索引的內容(透過 Table.prototype.get() 獲取),以顯示長度為 2,並且兩個元素都是 null

js
const tbl = new WebAssembly.Table({ initial: 2, element: "anyfunc" });
console.log(tbl.length); // "2"
console.log(tbl.get(0)); // "null"
console.log(tbl.get(1)); // "null"

然後,我們建立一個包含該表的匯入物件

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

最後,我們使用 WebAssembly.instantiateStreaming() 方法載入並例項化一個 Wasm 模組 (table2.wasm)。table2.wasm 模組包含兩個函式(一個返回 42,另一個返回 83),並將它們儲存到匯入表的元素 0 和 1 中(請參閱 文字表示)。因此,例項化後,表仍然長度為 2,但現在元素包含可呼叫的 匯出的 WebAssembly 函式,我們可以在 JS 中呼叫它們。

js
WebAssembly.instantiateStreaming(fetch("table2.wasm"), importObject).then(
  (obj) => {
    console.log(tbl.length);
    console.log(tbl.get(0)());
    console.log(tbl.get(1)());
  },
);

請注意,您需要在訪問器末尾包含第二個函式呼叫運算子才能實際呼叫引用的函式並記錄其中儲存的值(例如,get(0)() 而不是 get(0))。

此示例表明我們正在從 JavaScript 建立和訪問該表,但同一個表在 Wasm 例項內部也是可見和可呼叫的。

規範

規範
WebAssembly JavaScript 介面
# tables

瀏覽器相容性

另見