如何在Javascript中声明可选的函数参数?

Utt*_*tta 289 javascript

可能重复:
有没有更好的方法在Javascript中执行可选的函数参数?

我可以声明默认参数吗?

function myFunc( a, b=0) 
{ 
  // b is my optional parameter 
} 
Run Code Online (Sandbox Code Playgroud)

在javascript中.

Tig*_*ine 520

使用ES6:现在这是语言的一部分:

function myFunc(a, b = 0) {
   // function body
}
Run Code Online (Sandbox Code Playgroud)

请记住,ES6会检查值undefined而不是针对truthy-ness(因此只有真正的未定义值才能获得默认值 - 像null这样的虚假值不会默认值).


使用ES5:

function myFunc(a,b) {
  b = b || 0;

  // b will be set either to b or to 0.
}
Run Code Online (Sandbox Code Playgroud)

只要您明确传入的所有值都是真实的,这就可以正常工作.根据MiniGod的评论,这些值并非真实的:null, undefined, 0, false, ''

在函数实际启动之前,看到JavaScript库对可选输入进行一系列检查是很常见的.

  • 如果你只想要b的默认值,那么使用`if(typeof b ==='undefined')b = 0;` (65认同)
  • `null,undefined,0,false,'',NaN`都将获得默认值. (36认同)
  • 为什么?我将默认值设置为0.如果您想要另一个默认值,只需将其更改为"b = b ||" "foo'`. (6认同)
  • @kalu no,因为您已在本地范围(函数)中定义它.它在函数级别声明和作用域,但如果不从外部调用则将是未定义的.因此,此处不会发生全局范围分配. (4认同)
  • @MiniGod会在省略b时将`b`抛入全局命名空间吗? (2认同)

Ja͢*_*͢ck 86

更新

使用ES6,这可能完全按照您描述的方式进行; 详细说明可在文档中找到.

老答案

JavaScript中的默认参数主要有两种实现方式:

function myfunc(a, b)
{
    // use this if you specifically want to know if b was passed
    if (b === undefined) {
        // b was not passed
    }
    // use this if you know that a truthy value comparison will be enough
    if (b) {
        // b was passed and has truthy value
    } else {
        // b was not passed or has falsy value
    }
    // use this to set b to a default value (using truthy comparison)
    b = b || "default value";
}
Run Code Online (Sandbox Code Playgroud)

表达式b || "default value"计算值和存在,b并返回"default value"if b不存在或者为falsy的值.

替代声明:

function myfunc(a)
{
    var b;

    // use this to determine whether b was passed or not
    if (arguments.length == 1) {
        // b was not passed
    } else {
        b = arguments[1]; // take second argument
    }
}
Run Code Online (Sandbox Code Playgroud)

arguments函数内部提供特殊的"数组" ; 它包含所有参数,从索引0N - 1(其中N传递的参数数量).

这通常用于支持未知数量的可选参数(相同类型); 但是,说明预期的参数是首选!

进一步考虑

虽然undefined不可写,因为ES5,一些浏览器被称为不执行此.如果您担心这个问题,可以使用两种方法:

b === void 0;
typeof b === 'undefined'; // also works for undeclared variables
Run Code Online (Sandbox Code Playgroud)