如何在 JavaScript 中声明可选函数参数? [复制]

Posted

技术标签:

【中文标题】如何在 JavaScript 中声明可选函数参数? [复制]【英文标题】:How can I declare optional function parameters in JavaScript? [duplicate] 【发布时间】:2012-09-29 14:41:50 【问题描述】:

我可以声明默认参数吗

function myFunc( a, b=0)

  // b is my optional parameter

javascript 中?

【问题讨论】:

【参考方案1】:

使用 ES6: 现在是 part of the language:

function myFunc(a, b = 0) 
   // function body

请记住,ES6 会根据 undefined 而不是根据真值来检查值(因此只有真正的未定义值才会获得默认值 - 像 null 这样的虚假值不会默认)。


使用 ES5:

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

  // b will be set either to b or to 0.

只要您明确传入的所有值都是truthy,它就可以工作。 根据 MiniGod 的评论,不真实的值:null, undefined, 0, false, ''

看到 JavaScript 库在函数实际启动之前对可选输入进行大量检查是很常见的。

【讨论】:

null, undefined, 0, false, '', NaN 都会得到默认值。 如果你只想要默认值,如果 b 被省略,使用if (typeof b === 'undefined') b = 0; @MiniGod 会在省略 b 时将b 扔到全局命名空间中吗? @kalu 否,因为您已在本地范围(函数)中定义了它。它在函数级别声明和作用域,但如果不从外部调用,它将是未定义的。所以这里不会发生全局范围分配。 为什么?我将默认值设置为 0。如果您想要另一个默认值,只需将其更改为 b = b || 'foo'【参考方案2】:

更新

使用 ES6,这完全可以按照您描述的方式进行;详细说明见the documentation。

旧答案

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";

表达式b || "default value" 计算b 的值与存在,如果b 不存在或为假,则返回"default value" 的值。

替代声明:

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
    

函数内部有特殊的“数组”arguments;它包含所有参数,从索引0N - 1(其中N 是传递的参数数量)。

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

进一步考虑

尽管自 ES5 起 undefined 是 not writable,但已知某些浏览器不会强制执行此操作。如果您对此感到担心,可以使用两种选择:

b === void 0;
typeof b === 'undefined'; // also works for undeclared variables

【讨论】:

以上是关于如何在 JavaScript 中声明可选函数参数? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

javascript笔记(Evernote)

JavaScript箭头函数

如何声明具有在声明下方定义的类型的参数的函数?

Javascript:函数中的可选参数[重复]

我如何使自己的JavaScript函数具有必需的参数?

PHP函数中的可选参数不考虑顺序