在获取JS传入参数及其数量时,有哪些正确和错误的做法(结合示例说明)?

阅读 572
avatarAI BotBETA

正确做法

使用 arguments 对象

在 JavaScript 函数内部,可以使用 arguments 对象来获取传递给函数的参数及其数量。

示例

function exampleFunction() {
    console.log("Number of arguments: " + arguments.length);
    for (let i = 0; i < arguments.length; i++) {
        console.log("Argument " + (i + 1) + ": " + arguments[i]);
    }
}

exampleFunction(1, 'hello', true);

输出

Number of arguments: 3
Argument 1: 1
Argument 2: hello
Argument 3: true

使用剩余参数(Rest Parameters)

ES6 引入了剩余参数(Rest Parameters)语法,允许我们将一个不定数量的参数表示为一个数组。

示例

function exampleFunction(...args) {
    console.log("Number of arguments: " + args.length);
    args.forEach((arg, index) => {
        console.log("Argument " + (index + 1) + ": " + arg);
    });
}

exampleFunction(1, 'hello', true);

输出

Number of arguments: 3
Argument 1: 1
Argument 2: hello
Argument 3: true

错误做法

错误地假设函数参数数量固定

如果不使用 arguments 对象或剩余参数语法,函数将只能访问其显式声明的参数,无法处理额外传递的参数或缺少的参数。

示例

function exampleFunction(a, b, c) {
    console.log("Argument 1: " + a);
    console.log("Argument 2: " + b);
    console.log("Argument 3: " + c);
}

exampleFunction(1, 'hello');

输出

Argument 1: 1
Argument 2: hello
Argument 3: undefined

在这个例子中,尽管只传递了两个参数,函数仍然会尝试访问第三个参数(c),结果会是 undefined

错误地修改 arguments 对象

尽管 arguments 对象看起来像一个数组,但它并不是真正的数组,且修改 arguments 对象中的值并不会影响对应的命名参数,反之亦然(除非在非严格模式下且索引小于命名参数数量)。

示例(严格模式下)

'use strict';

function exampleFunction(a, b, c) {
    arguments[0] = 10;
    console.log("Argument 1 (arguments): " + arguments[0]);
    console.log("Argument 1 (named): " + a);
}

exampleFunction(1, 'hello', true);

输出

Argument 1 (arguments): 10
Argument 1 (named): 1

在严格模式下,修改 arguments 对象中的值不会影响命名参数。在非严格模式下,这种行为可能会有所不同,但通常也不建议依赖这种行为,因为它会导致代码难以理解和维护。

1 个回答
  • 正确做法:

    • 先传入nullptr获取传入参数真实数量,再根据数量创建合适大小的数组来获取参数,如GetArgvDemo1函数中,先通过OH_JSVM_GetCbInfo(env, info, &argc, nullptr, nullptr, nullptr)获取参数数量,然后创建JSVM_Value* argv = new JSVM_Value[argc]数组来获取参数,使用完后手动释放数组(delete argv)。
    • 正确声明argcargv的大小关系,如GetArgvDemo2函数中,size_t argc = 2JSVM_Value* argv[2] = {nullptr},确保OH_JSVM_GetCbInfo能正确写入参数。
    • 错误做法:

      • argc未正确初始化,导致其值不确定,可能使argv长度小于argc声明数量,造成数据越界,如IncorrectDemo1函数中,size_t argc未初始化,JSVM_Value argv[10] = {nullptr},调用OH_JSVM_GetCbInfo可能出错。
      • argc声明数量大于argv实际初始化长度,导致OH_JSVM_GetCbInfo写入argv时数据越界,如IncorrectDemo2函数中,size_t argc = 5JSVM_Value argv[3] = {nullptr},调用OH_JSVM_GetCbInfo会出现问题。

本文参与了 【 HarmonyOS NEXT 技术问答冲榜,等你来战!】欢迎正在阅读的你也加入。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题