Box<[T]> and Vec<T> - The `wasm-bindgen` Guide

# `Box<[T]>` and `Vec<T>`

`T` parameter | `&T` parameter | `&mut T` parameter | `T` return value | `Option<T>` parameter | `Option<T>` return value | JavaScript representation
--- | --- | --- | --- | --- | --- | ---
Yes | No | No | Yes | Yes | Yes | A JavaScript `Array` object

You can pass boxed slices and `Vec`s of several different types to and from JS:

- `JsValue`s.
- Imported JavaScript types.
- Exported Rust types.
- `String`s.

You can also pass boxed slices of numbers to JS, except that they're converted to typed arrays (`Uint8Array`, `Int32Array`, etc.) instead of regular arrays.

## Example Rust Usage

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

    #[wasm_bindgen]
    pub fn take_boxed_js_value_slice_by_value(x: Box<[JsValue]>) {}

    #[wasm_bindgen]
    pub fn return_boxed_js_value_slice() -> Box<[JsValue]> {
        vec![JsValue::NULL, JsValue::UNDEFINED].into_boxed_slice()
    }

    #[wasm_bindgen]
    pub fn take_option_boxed_js_value_slice(x: Option<Box<[JsValue]>>) {}

    #[wasm_bindgen]
    pub fn return_option_boxed_js_value_slice() -> Option<Box<[JsValue]>> {
        None
    }
    }

## Example JavaScript Usage

    import {
      take_boxed_js_value_slice_by_value,
      return_boxed_js_value_slice,
      take_option_boxed_js_value_slice,
      return_option_boxed_js_value_slice,
    } from './guide_supported_types_examples';

    take_boxed_js_value_slice_by_value([null, true, 2, {}, []]);

    let values = return_boxed_js_value_slice();
    console.log(values instanceof Array); // true

    take_option_boxed_js_value_slice(null);
    take_option_boxed_js_value_slice(undefined);
    take_option_boxed_js_value_slice([1, 2, 3]);

    let maybeValues = return_option_boxed_js_value_slice();
    if (maybeValues == null) {
      // ...
    } else {
      console.log(maybeValues instanceof Array); // true
    }