Numbers - The wasm-bindgen
Guide (original) (raw)
- Introduction
- 1. Examples
- 1.1. Hello, World!
- 1.2. Using console.log
- 1.3. Small Wasm files
- 1.4. Without a Bundler
- 1.5. Synchronous Instantiation
- 1.6. Importing functions from JS
- 1.7. Working with char
- 1.8. js-sys: WebAssembly in WebAssembly
- 1.9. web-sys: DOM hello world
- 1.10. web-sys: Closures
- 1.11. web-sys: performance.now
- 1.12. web-sys: using fetch
- 1.13. web-sys: Weather report
- 1.14. web-sys: canvas hello world
- 1.15. web-sys: canvas Julia set
- 1.16. web-sys: WebAudio
- 1.17. web-sys: WebGL
- 1.18. web-sys: WebSockets
- 1.19. web-sys: WebRTC DataChannel
- 1.20. web-sys: requestAnimationFrame
- 1.21. web-sys: A Simple Paint Program
- 1.22. web-sys: Wasm in Web Worker
- 1.23. Parallel Raytracing
- 1.24. Wasm Audio Worklet
- 1.25. web-sys: A TODO MVC App
- 2. Reference
- 2.1. Deployment
- 2.2. JS snippets
- 2.3. Static JS Objects
- 2.4. Passing Rust Closures to JS
- 2.5. Receiving JS Closures in Rust
- 2.6. Promises and Futures
- 2.7. Iterating over JS Values
- 2.8. Arbitrary Data with Serde
- 2.9. Accessing Properties of Untyped JS Values
- 2.10. Working with Duck-Typed Interfaces
- 2.11. Command Line Interface
- 2.12. Optimizing for Size
- 2.13. Supported Rust Targets
- 2.14. Supported Browsers
- 2.15. Support for Weak References
- 2.16. Support for Reference Types
- 2.17. Supported Types
- 2.18. #[wasm_bindgen] Attributes
- 2.18.1. On JavaScript Imports
- 2.18.1.1. catch
- 2.18.1.2. constructor
- 2.18.1.3. extends
- 2.18.1.4. getter and setter
- 2.18.1.5. final
- 2.18.1.6. indexing_getter, indexing_setter, and indexing_deleter
- 2.18.1.7. js_class = "Blah"
- 2.18.1.8. js_name
- 2.18.1.9. js_namespace
- 2.18.1.10. method
- 2.18.1.11. module = "blah"
- 2.18.1.12. raw_module = "blah"
- 2.18.1.13. no_deref
- 2.18.1.14. static_method_of = Blah
- 2.18.1.15. structural
- 2.18.1.16. typescript_type
- 2.18.1.17. variadic
- 2.18.1.18. vendor_prefix
- 2.18.1.1. catch
- 2.18.2. On Rust Exports
- 2.18.2.1. constructor
- 2.18.2.2. js_name = Blah
- 2.18.2.3. js_class = Blah
- 2.18.2.4. readonly
- 2.18.2.5. skip
- 2.18.2.6. skip_jsdoc
- 2.18.2.7. start
- 2.18.2.8. main
- 2.18.2.9. typescript_custom_section
- 2.18.2.10. getter and setter
- 2.18.2.11. inspectable
- 2.18.2.12. skip_typescript
- 2.18.2.13. getter_with_clone
- 2.18.2.14. unchecked_return_type and unchecked_param_type
- 2.18.2.15. return_description and param_description
- 2.18.2.1. constructor
- 3. web-sys
- 4. Testing with wasm-bindgen-test
- 5. Contributing to wasm-bindgen
- 5.2. Internal Design
- 5.3. js-sys
- 5.4. web-sys
- 5.5. Publishing
- 5.6. Team
The `wasm-bindgen` Guide
Numbers: u8, i8, u16, i16, u32, i32, u64, i64, u128, i128, isize, usize, f32, and f64
T parameter | &T parameter | &mut T parameter | T return value | Option parameter | Option return value | JavaScript representation |
---|---|---|---|---|---|---|
Yes | No | No | Yes | Yes | Yes | A JavaScript number or bigint value |
JavaScript Numbers are 64-bit floating point value under the hood and cannot accurately represent all of Rust's numeric types. wasm-bindgen
will automatically use either BigInt or Number
to accurately represent Rust's numeric types in JavaScript:
u8
,i8
,u16
,i16
,u32
,i32
,isize
,usize
,f32
, andf64
will be represented asNumber
in JavaScript.u64
,i64
,u128
, andi128
will be represented asBigInt
in JavaScript.
Note: Wasm is currently a 32-bit architecture, so
isize
andusize
are 32-bit integers and "fit" into a JavaScriptNumber
.
Note:
u128
andi128
requirewasm-bindgen
version 0.2.96 or later.
Converting from JavaScript to Rust
wasm-bindgen
will automatically handle the conversion of JavaScript numbers to Rust numeric types. The conversion rules are as follows:
Number to u8, i8, u16, i16, u32, i32, isize, and usize
If the JavaScript number is Infinity
, -Infinity
, or NaN
, then the Rust value will be 0. Otherwise, the JavaScript number will rounded towards zero (see Math.trunc or f64::trunc). If the rounded number is too large or too small for the target integer type, it will wrap around.
For example, if the target type is i8
, Rust will see the following values for the following inputs:
JS input number | Rust value (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 |
This is the same behavior as assigning the JavaScript Number
to a typed array of the appropriate integer type in JavaScript, i.e. new Uint8Array([value])[0]
.
Except for the handling of Infinity
and -Infinity
, this is the same behavior as casting f64
to the appropriate integer type in Rust, i.e. value_f64 as u32
.
BigInt to u64, i64, u128, and i128
If the JavaScript BigInt
is too large or too small for the target integer type, it will wrap around.
This is the same behavior as assigning the JavaScript BigInt
to a typed array for 64-bit integer types in JavaScript, i.e. new Int64Array([value])[0]
.
The JavaScript Number
is converted to a Rust f32
using the same rules as casting f64
to f32
in Rust, i.e. value_f64 as f32
.
This is the same behavior as Math.fround or assigning the JavaScript Number
to a Float32Array in JavaScript, i.e. new Float32Array([value])[0]
.
Since JavaScript numbers are 64-bit floating point values, converting a JavaScript Number
to a Rust f64
is a no-op.
# #![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)
}
#}
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"
}