数字: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 数字类型的转换。转换规则如下

Numberu8i8u16i16u32i32isizeusize

如果 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 Number 分配给 JavaScript 中适当整数类型的 类型化数组 的行为相同,即 new Uint8Array([value])[0]

除了处理 Infinity-Infinity 之外,这与在 Rust 中将 f64 转换为适当的整数类型的行为相同,即 value_f64 as u32

BigIntu64i64u128i128

如果 JavaScript BigInt 对于目标整数类型来说太大或太小,它将回绕。

这与将 JavaScript BigInt 分配给 JavaScript 中 64 位整数类型的 类型化数组 的行为相同,即 new Int64Array([value])[0]

Numberf32

JavaScript Number 使用与 Rust 中将 f64 转换为 f32 相同的规则转换为 Rust f32,即 value_f64 as f32

这与 Math.fround 或将 JavaScript Number 分配给 JavaScript 中的 Float32Array 的行为相同,即 new Float32Array([value])[0]

Numberf64

由于 JavaScript 数字是 64 位浮点值,因此将 JavaScript Number 转换为 Rust f64 是一个空操作。

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"
}