数字:u8、i8、u16、i16、u32、i32、u64、i64、u128、i128、isize、usize、f32 和 f64
T 参数 | &T 参数 | &mut T 参数 | T 返回值 | Option<T> 参数 | Option<T> 返回值 | JavaScript 表示 |
|---|---|---|---|---|---|---|
| 是 | 否 | 否 | 是 | 是 | 是 | JavaScript 数字或 bigint 值 |
JavaScript Number 在底层是 64 位浮点值,无法精确表示 Rust 的所有数值类型。wasm-bindgen 将自动使用 BigInt 或 Number 来精确表示 JavaScript 中 Rust 的数值类型
u8、i8、u16、i16、u32、i32、isize、usize、f32和f64将在 JavaScript 中表示为Number。u64、i64、u128和i128将在 JavaScript 中表示为BigInt。
注意:Wasm 目前是 32 位架构,因此
isize和usize是 32 位整数,并且可以“放入” JavaScriptNumber。
注意:
u128和i128需要wasm-bindgen版本 0.2.96 或更高版本。
从 JavaScript 转换为 Rust
wasm-bindgen 将自动处理 JavaScript 数字到 Rust 数值类型的转换。转换规则如下
Number 到 u8、i8、u16、i16、u32、i32、isize 和 usize
如果 JavaScript 数字是 Infinity、-Infinity 或 NaN,则 Rust 值将为 0。否则,JavaScript 数字将向零舍入(参见 Math.trunc 或 f64::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 |
±无穷大 | 0 |
NaN | 0 |
这与将 JavaScript Number 赋值给 JavaScript 中相应整数类型的 类型化数组 的行为相同,例如 new Uint8Array([value])[0]。
除了对 Infinity 和 -Infinity 的处理外,这与 Rust 中将 f64 强制转换 为相应整数类型的行为相同,例如 value_f64 as u32。
BigInt 到 u64、i64、u128 和 i128
如果 JavaScript BigInt 对于目标整数类型来说太大或太小,它将环绕。
这与将 JavaScript BigInt 赋值给 JavaScript 中 64 位整数类型的 类型化数组 的行为相同,例如 new Int64Array([value])[0]。
Number 到 f32
JavaScript Number 使用与 Rust 中将 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)] 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"
}