數字: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 |
±Infinity | 0 |
NaN | 0 |
這與在 JavaScript 中將 JavaScript Number
指派給適當整數類型的 typed array 的行為相同,即 new Uint8Array([value])[0]
。
除了處理 Infinity
和 -Infinity
之外,這與在 Rust 中將 casting f64
轉換為適當整數類型的行為相同,即 value_f64 as u32
。
BigInt
轉換為 u64
、i64
、u128
和 i128
如果 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"
}