【问题标题】:Default argument values in JavaScript functions [duplicate]JavaScript 函数中的默认参数值 [重复]
【发布时间】:2011-09-23 02:22:54
【问题描述】:

可能重复:
How do I make a default value for a parameter to a javascript function

在 PHP 中:

function func($a = 10, $b = 20){
  // if func() is called with no arguments $a will be 10 and $ b  will be 20
}

如何在 JavaScript 中做到这一点?

如果我尝试在函数参数中赋值,我会收到错误

形式参数后缺少)

【问题讨论】:

  • 简单:其中“1”是默认值。函数 abc (arg){ arg=arg===undefined?1:arg; }

标签: javascript function arguments


【解决方案1】:

在 javascript 中,您可以调用不带参数的函数(即使它有参数)。

所以你可以像这样添加默认值:

function func(a, b){
   if (typeof(a)==='undefined') a = 10;
   if (typeof(b)==='undefined') b = 20;

   //your code
}

然后你可以像func();一样调用它来使用默认参数。

这是一个测试:

function func(a, b){
   if (typeof(a)==='undefined') a = 10;
   if (typeof(b)==='undefined') b = 20;

   alert("A: "+a+"\nB: "+b);
}
//testing
func();
func(80);
func(100,200);

【讨论】:

  • @Aftershock == 有一些已知问题,因此最好使用===,除非== 是必要的。见stackoverflow.com/questions/359494/…
  • 奇怪的是,我觉得 Firefox 让我定义默认参数......或者至少,它肯定没有抛出语法错误。铬做到了:感谢铬!而你你@Ravan
  • @Ziggy:从 FF 15.0 开始,FF 确实支持默认参数。它是目前唯一这样做的浏览器,但此功能是为 ECMAScript 6 提出的 - developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
  • 范围界定怎么样?如果没有关键字 var,创建的值是否具有全局范围?
  • @Magnus,不,因为参数列表中存在变量意味着它是在本地定义的。即使调用者省略了参数,它也会在本地定义为undefined 类型的变量。
【解决方案2】:

ES2015 以后:

从 ES6/ES2015 开始,我们在语言规范中有默认参数。所以我们可以做一些简单的事情,比如,

function A(a, b = 4, c = 5) {
}

或结合ES2015 destructuring,

function B({c} = {c: 2}, [d, e] = [3, 4]) {
}

详细解释,

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/default_parameters

默认函数参数允许在传递no valueundefined时使用默认值初始化形式参数。

ES2015 之前:

如果您要处理 NOT 数字、字符串、布尔值、NaNnull 的值,您可以简单地使用

(因此,对于您计划永远不会发送null 的对象、数组和函数,您可以使用)

param || DEFAULT_VALUE

例如,

function X(a) {
  a = a || function() {};
}

虽然这看起来很简单并且有点工作,但这是限制性的并且可能是反模式,因为|| 对所有虚假值(""nullNaNfalse0 ) 太 - 这使得该方法无法将作为参数传递的虚假值分配给参数。

因此,为了仅显式处理 undefined 值,首选方法是,

function C(a, b) {
  a = typeof a === 'undefined' ? DEFAULT_VALUE_A : a;
  b = typeof b === 'undefined' ? DEFAULT_VALUE_B : b;
}

【讨论】:

  • 排序...除非 a===false 则 a=默认值
  • 默认值仅在未设置参数时使用...而不是在设置为 false 时使用 .... 这是一种错误的操作方式 .... undefined、null 和假..这三个是不同的...
  • 如果你正在测试的变量是假的,那么这个语句将把它当作它是未定义的或空的。:function testMe(a,b){ alert(a || 'fail'); } testMe(false);
  • 这不正确。 任何“falsey”值将导致设置默认值。错误值为NaNundefinednull0""false
  • 谢谢...编辑了答案。
【解决方案3】:

你必须检查参数是否未定义:

function func(a, b) {
    if (a === undefined) a = "default value";
    if (b === undefined) b = "default value";
}

还要注意,这个问题一直是answeredbefore

【讨论】:

    【解决方案4】:

    我从未在 JavaScript 中看到过这种方式。如果您想要一个带有可选参数的函数,如果参数被省略,则该函数会被分配默认值,这是一种方法:

     function(a, b) {
          if (typeof a == "undefined") {
            a = 10;
          }
    
          if (typeof b == "undefined") {
            a = 20;
          }
    
          alert("a: " + a + " b: " + b);
        }
    

    【讨论】:

      【解决方案5】:
      function func(a, b)
      {
        if (typeof a == 'undefined')
          a = 10;
        if (typeof b == 'undefined')
          b = 20;
        // do what you want ... for example
        alert(a + ',' + b);
      }
      

      简写

      function func(a, b)
      {
        a = (typeof a == 'undefined')?10:a;
        b = (typeof b == 'undefined')?20:b;
      
        // do what you want ... for example
        alert(a + ',' + b);
      }
      

      【讨论】:

      • 你也可以使用a === undefined
      • 最好使用 typeof a === 'undefined' ,因为可以发生类型强制。1==true 为真 ....1===true 为假
      • @jtbandes,它避免了有人做了undefined = somevalue
      • @GabyakaG.Petrioli 无关。谁他妈会这样做?
      • @venimus 你永远不知道你的代码的上下文..
      【解决方案6】:

      您不能为函数参数添加默认值。但你可以这样做:

      function tester(paramA, paramB){
       if (typeof paramA == "undefined"){
         paramA = defaultValue;
       }
       if (typeof paramB == "undefined"){
         paramB = defaultValue;
       }
      }
      

      【讨论】:

      • 这不是最好的方法,因为如果没有传递参数,那么它实际上是undefined。碰巧undefined == null 返回 true。
      • 我认为您的原始答案很好,因为 nullundefined 将触发默认值的解释。有时这是期望的行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      相关资源
      最近更新 更多