數字:u8i8u16i16u32i32u64i64u128i128isizeusizef32f64

T 參數 &T 參數 &mut T 參數 T 回傳值 Option<T> 參數 Option<T> 回傳值JavaScript 表示法
JavaScript 數字或 bigint 值

JavaScript Number 在底層是 64 位元浮點數值,無法精確表示所有 Rust 的數值類型。wasm-bindgen 會自動使用 BigIntNumber 來精確表示 JavaScript 中的 Rust 數值類型

  • u8i8u16i16u32i32isizeusizef32f64 在 JavaScript 中會表示為 Number
  • u64i64u128i128 在 JavaScript 中會表示為 BigInt

注意:Wasm 目前是 32 位元架構,因此 isizeusize 是 32 位元整數,並且「適合」放入 JavaScript Number 中。

注意u128i128 需要 wasm-bindgen 版本 0.2.96 或更新版本。

從 JavaScript 轉換為 Rust

wasm-bindgen 會自動處理 JavaScript 數字到 Rust 數值類型的轉換。轉換規則如下

Number 轉換為 u8i8u16i16u32i32isizeusize

如果 JavaScript 數字是 Infinity-InfinityNaN,則 Rust 值會是 0。否則,JavaScript 數字會向零捨去(請參閱 Math.truncf64::trunc)。如果捨去後的數字對於目標整數類型而言太大或太小,它將會迴繞。

例如,如果目標類型是 i8,Rust 會看到以下輸入的以下值

JS 輸入數字Rust 值 (i8)
42 42
-42 -42
1.999 1
-1.999 -1
127 127
128 -128
255 -1
256 0
-0 0
±Infinity 0
NaN 0

這與在 JavaScript 中將 JavaScript Number 指派給適當整數類型的 typed array 的行為相同,即 new Uint8Array([value])[0]

除了處理 Infinity-Infinity 之外,這與在 Rust 中將 casting f64 轉換為適當整數類型的行為相同,即 value_f64 as u32

BigInt 轉換為 u64i64u128i128

如果 JavaScript BigInt 對於目標整數類型而言太大或太小,它將會迴繞。

這與將 JavaScript BigInt 指派給 JavaScript 中 64 位元整數類型的 typed array 的行為相同,即 new Int64Array([value])[0]

Number 轉換為 f32

JavaScript Number 使用與在 Rust 中將 casting f64 轉換為 f32 相同的規則轉換為 Rust f32,即 value_f64 as f32

這與 Math.fround 或將 JavaScript Number 指派給 JavaScript 中的 Float32Array 的行為相同,即 new Float32Array([value])[0]

Number 轉換為 f64

由於 JavaScript 數字是 64 位元浮點數值,因此將 JavaScript Number 轉換為 Rust f64 是 no-op。

Rust 使用範例


# #![allow(unused_variables)]
#fn main() {
use wasm_bindgen::prelude::*;

#[wasm_bindgen]
pub fn take_number_by_value(x: u32) {}

#[wasm_bindgen]
pub fn return_number() -> f64 {
    42.0
}

#[wasm_bindgen]
pub fn take_option_number(x: Option<u8>) {}

#[wasm_bindgen]
pub fn return_option_number() -> Option<i16> {
    Some(-300)
}

#}

JavaScript 使用範例

import {
  take_number_by_value,
  return_number,
  take_option_number,
  return_option_number,
} from './guide_supported_types_examples';

take_number_by_value(42);

let x = return_number();
console.log(typeof x); // "number"

take_option_number(null);
take_option_number(undefined);
take_option_number(13);

let y = return_option_number();
if (y == null) {
  // ...
} else {
  console.log(typeof y); // "number"
}