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

我可以声明默认参数吗

function myFunc( a, b=0)
{
  // b is my optional parameter
}

在 JavaScript 中?

【问题讨论】:

    标签: 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 起 undefinednot writable,但已知某些浏览器不会强制执行此操作。如果您对此感到担心,可以使用两种选择:

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

    【讨论】:

      猜你喜欢
      • 2018-03-23
      • 2019-02-09
      • 1970-01-01
      • 2020-09-20
      • 2010-12-27
      • 1970-01-01
      • 2022-01-16
      • 1970-01-01
      • 2022-07-01
      相关资源
      最近更新 更多