在JavaScript中,如何使用可选参数创建函数?

时间:2010-02-09 00:14:59

标签: javascript html

问题:在JavaScript中定义带有可选参数的函数的正确方法是什么?

例如:

function myFunc(optionVar1) {
    if(optionVar1 == undefined) {
        ...
    } else {
        ...
    }
}

myFunc('10');  // valid function call
myFunc();      // also a valid function call

在函数声明中使用类似Ruby的?标记是否合适,以表示可选参数:

function myFunc(optionVar1?) {...}  //  <--- notice the ? mark

11 个答案:

答案 0 :(得分:59)

Javascript中没有语法指定参数是可选的(或必需的)。所有参数都是可选的。如果未指定它们,则为undefined,因此您需要检查它。例如,此函数实际上会为参数创建默认值10:

function myfunc(someParam) {
  if (someParam === undefined) {
    someParam = 10;
  }
  ...
}

您还可以使用arguments属性以编程方式访问参数。

最后,如果你有超过3-4个参数,通常建议使用匿名对象。

答案 1 :(得分:7)

实际上,JS函数中的所有参数都是可选的。如果省略参数,则没有警告或错误。

您可以设置默认值,如

function throw_cat(dist){
  dist = typeof dist=='undefined' ? 20 : dist;
   //OR
  dist = dist || 20; //this will assign it to 20 if you pass 0 or another 'falsy' value, though. May be good if you expect a string. String '0' stays, '' or null assigns the default
  //etc...
  }

答案 2 :(得分:4)

使用doclet时,您可以在评论部分使用{Object =}或{number =}等注释:

/** 
 * @param {object=}xyz
 */ 

现代IDE知道识别JavaScript的注释并向您显示代码中潜在问题的迹象。

示例:

/**
 *
 * @param query 
 * @param callback 
 * @param {number=} ttl optional time-to-leave
 */
 loadByJSONP:function loadByJSONP(query, callback, ttl) {
   ...do some work
 }

在此示例中,'ttl'是可选的。注释{number =}向IDE指示此参数是可选的。因此,当您仅使用两个参数调用此函数时,您将不会收到警告。

注释也可用于指定预期类型。这使您的代码更好,更不容易出错。以下是注释的链接:

https://developers.google.com/closure/compiler/docs/js-for-compiler

答案 3 :(得分:3)

首先,每个编写JavaScript的人都会帮自己一个忙,并从Learning Advanced JavaScript开始John Resig

function myFunc(arg1, arg2 /* varargs... */) {
  var optional = Array.prototype.slice.call( arguments, 2 );

函数的每个参数都是“可选的”,即使是在函数声明的参数列表中声明的参数。

请仔细考虑documenting

答案 4 :(得分:2)

某些来源会告诉您完全跳过参数,而是使用arguments数组。这使您可以获取提供给函数的任何输入,并且可以根据需要决定如何响应传递给函数的参数。

您可以在此处详细了解: http://www.devguru.org/technologies/ecmascript/quickref/arguments.html

答案 5 :(得分:2)

克莱特斯和达莫维萨提出了很好的建议。我还想补充一点(像我一样)可能更喜欢这样的符号:

function foo(/*bar*/) {
   if (arguments.length == 1) {
      var bar = arguments[0];
      ...
   }
}

这用于向代码库的开发人员记录该参数是可选的并且还记录了名称,但它也阻止了参数在调试器中显示在函数名中(该示例将显示为 foo()而不是 foo(optional_argument)。否则,使用API​​的开发人员可能会认为它是必需的。

编辑:这对于打算在内部使用的可选参数特别有用。

答案 6 :(得分:1)

我发现的第一个谷歌回复:

http://www.tipstrs.com/tip/354/Using-optional-parameters-in-Javascript-functions

我没有看到任何使用问号向呼叫者提醒可选参数的情况。虽然它是用其他语言完成的,但我不认为它在javascript中是必要的。

事实上,it seems that you can't use a question mark in the variable name。只有字母,数字,$和_。

答案 7 :(得分:1)

只是不要使用任何参数定义函数,并从您希望可选参数的函数中访问特殊参数数组。示例如下。

<HTML>
<HEAD>
<SCRIPT Language="JavaScript">
function foo() {
  var argv = foo.arguments;
  var argc = argv.length;
  for (var i = 0; i < argc; i++) {
    alert("Argument " + i + " = " + argv[i]);
   }
}
</SCRIPT>
</HEAD>
<BODY onload="foo('hello', 'world');">
</BODY>
</HTML>

答案 8 :(得分:1)

  

使用是否合适?在函数声明中标记为Ruby

不,没有基于语言的方式表示可选的arg。我绝对认为值得在评论中指出:

function myFunc(var1, var2 /* optional */, var3 /* optional */) {
    if (var2===undefined) ...

(注意精确相等测试的三重等于。否则传递的null值也将匹配。对于JS中的大多数比较,您通常需要===,因为双等于不合需要的弱 - 键入。)

当你有一个不确定数量的可选参数时,你通常会从函数语句中省略它们,并且评论是礼貌的:

function myFunc(var1 /* , optional var2..varN */) {
    for (var i= 1; i<arguments.length; i++) ...

答案 9 :(得分:0)

出于历史考虑:您可以使用!= null检查来循环输入参数。例如:

function container(param1, param2, param3, param4){
    var param1, param2, param3, param4 = 0 // or other data types.
    for (var i = 0; i < arguments.length; i++){
       if(i != null) {
       console.log(i); // or put default values to your parameters if you need to.
    }
}

现在,所有参数都变为可选。

答案 10 :(得分:0)

function connect(hostname, port, method) {
   hostname = hostname || "localhost";
   port = port || 80;
   method = method || "GET";
}

重要网址Optional Parameters in Javascript