📋 基本类型映射
| JavaScript | Neon (Rust) | 提取方法 |
|---|---|---|
| string | JsString | .value(&mut cx) → String |
| number | JsNumber | .value(&mut cx) → f64 |
| boolean | JsBoolean | .value(&mut cx) → bool |
| null | JsNull | - |
| undefined | JsUndefined | - |
| object | JsObject | 见下文 |
| array | JsArray | .to_vec(&mut cx) |
| function | JsFunction | .call(&mut cx, ...) |
| Promise | JsPromise | 见异步章节 |
🔢 数字类型
rust
fn number_example(mut cx: FunctionContext) -> JsResult {
// 获取数字
let num = cx.argument::(0)?.value(&mut cx);
// 转换为整数
let int_val = num as i32;
let uint_val = num as u32;
// 返回数字
Ok(cx.number(int_val as f64))
}
注意:JavaScript 数字是 64 位浮点数,转换时注意精度。
📝 字符串类型
rust
fn string_example(mut cx: FunctionContext) -> JsResult {
// 获取字符串
let s = cx.argument::(0)?.value(&mut cx);
// Rust 字符串操作
let upper = s.to_uppercase();
// 返回字符串
Ok(cx.string(upper))
}
📦 对象操作
rust
fn object_example(mut cx: FunctionContext) -> JsResult {
let obj = cx.empty_object();
// 设置属性
obj.set(&mut cx, "name", cx.string("Neon"))?;
obj.set(&mut cx, "version", cx.number(1.0))?;
// 嵌套对象
let nested = cx.empty_object();
nested.set(&mut cx, "key", cx.string("value"))?;
obj.set(&mut cx, "nested", nested)?;
Ok(obj)
}
fn read_object(mut cx: FunctionContext) -> JsResult {
let obj = cx.argument::(0)?;
let name: Handle = obj.get(&mut cx, "name")?;
Ok(name)
}
📚 数组操作
rust
fn array_example(mut cx: FunctionContext) -> JsResult {
let arr = cx.empty_array();
// 添加元素
arr.set(&mut cx, 0, cx.number(1.0))?;
arr.set(&mut cx, 1, cx.string("two"))?;
// 获取长度
let len = arr.len(&mut cx);
Ok(arr)
}
fn read_array(mut cx: FunctionContext) -> JsResult {
let arr = cx.argument::(0)?;
// 转为 Vec
let vec = arr.to_vec(&mut cx)?;
// 遍历
for (i, item) in vec.iter().enumerate() {
let num: Handle = item.downcast_or_throw(&mut cx)?;
println!("{}: {}", i, num.value(&mut cx));
}
Ok(cx.number(vec.len() as f64))
}
🔄 类型转换
rust
fn convert_example(mut cx: FunctionContext) -> JsResult {
let val = cx.argument::(0)?;
// 尝试转换
if let Ok(num) = val.downcast::(&mut cx) {
return Ok(num.upcast());
}
if let Ok(s) = val.downcast::(&mut cx) {
return Ok(s.upcast());
}
// 或抛出错误
cx.throw_error("Expected number or string")
}