小编典典

如何最好地确定参数是否未发送到 JavaScript 函数

all

我现在已经看到了 2 种方法来确定参数是否已传递给 JavaScript 函数。我想知道一种方法是否比另一种更好,或者一种方法不好用?

 function Test(argument1, argument2) {
      if (Test.arguments.length == 1) argument2 = 'blah';

      alert(argument2);
 }

 Test('test');

或者

 function Test(argument1, argument2) {
      argument2 = argument2 || 'blah';

      alert(argument2);
 }

 Test('test');

据我所知,它们都会产生相同的结果,但我之前只在生产中使用过第一个。

提到的另一个选项:

function Test(argument1, argument2) {
    if(argument2 === null) {
        argument2 = 'blah';
    }

    alert(argument2);
}

根据胡安的评论,最好将汤姆的建议改为:

function Test(argument1, argument2) {
    if(argument2 === undefined) {
        argument2 = 'blah';
    }

    alert(argument2);
}

阅读 88

收藏
2022-05-19

共1个答案

小编典典

有几种不同的方法可以检查参数是否传递给函数。除了您在(原始)问题中提到的两个 - 检查arguments.length或使用||运算符提供默认值 -
还可以显式检查参数是否undefined通过argument2 === undefinedtypeof argument2 === 'undefined'是否偏执(见评论)。

使用||运算符已成为标准做法 - 所有酷孩子都这样做 - 但要小心:如果参数评估为
,则将触发默认值false,这意味着它实际上可能是undefined, null, false, 0,
''(或任何其他Boolean(...)返回false)。

所以问题是何时使用哪种检查,因为它们都会产生略有不同的结果。

检查arguments.length表现出“最正确”的行为,但如果有多个可选参数,则可能不可行。

测试undefined是下一个“最好的”——如果函数是用一个undefined值显式调用的,它只会“失败”,这很可能应该被视为与省略参数相同的方式。

||即使提供了有效参数,使用运算符也可能触发使用默认值。另一方面,它的行为实际上可能是合乎需要的。

总结一下: 只有在你知道自己在做什么的情况下才使用它!

在我看来,||如果有多个可选参数并且不想传递对象文字作为命名参数的解决方法,那么 using 也是一种方法。

另一种提供默认值的好方法arguments.length是通过 switch 语句的标签:

function test(requiredArg, optionalArg1, optionalArg2, optionalArg3) {
    switch(arguments.length) {
        case 1: optionalArg1 = 'default1';
        case 2: optionalArg2 = 'default2';
        case 3: optionalArg3 = 'default3';
        case 4: break;
        default: throw new Error('illegal argument count')
    }
    // do stuff
}

这样做的缺点是程序员的意图(视觉上)不明显并且使用“幻数”;因此,它可能容易出错。

2022-05-19