📋 基本类型映射

JavaScriptNeon (Rust)提取方法
stringJsString.value(&mut cx) → String
numberJsNumber.value(&mut cx) → f64
booleanJsBoolean.value(&mut cx) → bool
nullJsNull-
undefinedJsUndefined-
objectJsObject见下文
arrayJsArray.to_vec(&mut cx)
functionJsFunction.call(&mut cx, ...)
PromiseJsPromise见异步章节

🔢 数字类型

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")
}