如何测试函数是否提供了参数?

90
我在想,你能否创建一个带有可选参数的函数。
例如:
function parameterTest(test)
{
   if exists(test)
   {
     alert('the parameter exists...');
   }
   else
   {
     alert('The parameter doesn\'t exist...');
   }
}

如果您调用parameterTest(),则结果将是一条消息“参数不存在...”。如果您调用parameterTest(true),则它将返回“参数存在...”。

这种情况可能吗?


1
http://www.openjs.com/articles/optional_function_arguments.php - Jared
这是一个非常古老的问题,但显然每天都有人查看,感谢您的输入。我编辑了原帖以使其更清晰。 - Guido Visser
我认为现实世界中的情况是如何检查函数的参数。控制器服务模型层。将有许多需要检查的参数。 - Lin Du
9个回答

119

这是一个非常常见的模式。

你可以使用以下方式进行测试:

function parameterTest(bool) {
  if (bool !== undefined) {
您可以使用这些形式之一调用您的函数:
 parameterTest();
 parameterTest(someValue);

小心不要犯常见的测试错误

if (!bool) {

因为你无法区分未提供的值与 false0""


4
-1 表示建议 === undefined - 在您的代码之前尝试 var undefined = true,看看会发生什么...正确的检查应该是 typeof book === 'undefined'。 - griffin
10
如果有人在他们的代码中写了 var undefined,那么他们应该受到惩罚。window.undefined 不能被写入,原因与 window.infinitywindow.NaN 相同 - 它们应该用于表示其规范定义的相应值。 - John Dvorak
21
@griffin,你说得很对。我们应该停止使用undefined,因为它随时可能会改变!我们最好也别再使用ObjectDate了,有人可能已经篡改了它们。并且永远不要相信document.createElement,因为它可能被覆盖! - Zirak
2
@griffin 当然,undefined是一个局部变量。这就是为什么它是全局对象的属性,显然Object不能被覆盖的原因。 - Zirak
4
@griffin 简而言之,undefinedObject拥有完全相同的状态:它是全局对象的一个不可写属性(自ES5起),由规范定义,如果你使用了同名变量,则是你的问题。没有理由只使用其中一个而不使用另一个。此外,如果你的用户脚本所对应的页面重新定义了其中一个属性,Greasemonkey仍然通过为每个用户脚本提供单独的全局作用域来保护你。 - John Dvorak
显示剩余15条评论

14
function parameterTest(bool)
{
   if(typeof bool !== 'undefined')
   {
     alert('the parameter exists...');
   }
   else
   {
     alert('The parameter doesn\'t exist...');
   }
}

7

在JavaScript中,如果您忽略给出一个参数,它将默认为undefined

您可以轻松地在浏览器控制台或使用JSFiddle中尝试自己。

您可以检查参数的存在性,并编写一个可以使用参数或不使用参数的函数。然而,JavaScript Garden(一个很好的资源)建议在大多数其他情况下避免使用typeof,因为其输出几乎没有用处(查看typeof结果表)。


1
作为一种替代方案,jQuery确实提供了一个$.type方法,可以在各种浏览器上保持一致。 - Kevin B
2
该链接表示 typeof 仅在这种情况下有用,这使得它对于这个问题足够好。 - EralpB

6

如果不存在,则初始化默认值:

function loadDialog(fn, f, local, anim) {
  switch (arguments.length) {  
    case 1: f=null;
    case 2: local=false;
    case 3: anim=false;
  }
  ...
}

请考虑解释您的代码以及它如何帮助,这样其他人也可以从中受益。 - Amit Verma
2
这对我来说是正确的答案,因为我需要区分根本没有传递值与将未定义的值传递给函数。其他答案没有考虑传递未定义的情况。 - Kevin Beal
神秘但不错。还可以区分loadDialog(fn, undefined)loadDialog(fn) - Walter Tross

3

对于我来说,这些答案都不太满意。我需要知道是否有人使用了该参数。如果有人传递undefined,我希望将其视为使用该值作为参数。无论如何,使用一些现代的JS解决方案非常容易:

function parameterTest(...test) {
  if (test.length) {
    return `exists`;
  } else {
    return `not exists`;
  }
}

parameterTest(123);         // exists
parameterTest(undefined);   // exists
parameterTest();            // not exists
parameterTest(window.blah); // exists

对于旧版浏览器,您可以使用参数:

function parameterTest() {
  if (arguments.length) {
    return "exists";
  } else {
    return "not exists";
  }
}

1
相同的答案已经被添加了。不过你解释得更好。 - Kevin Beal
1
谢谢!忽略“undefined”的20个答案,然后是这个。+1 用于通用解决方案,并且鼓励arguments伪数组的古老艺术。 - Silvio Mayolo

3

检查最佳方法:如果参数不是未定义

function parameterTest(param) {
    if (param !== undefined)
    ...

param也可以是变量或函数名。


3
function parameterTest(p) {
    if ( p === undefined)
        alert('The parameter doesn\'t exist...');
    else
        alert('the parameter exists...');
}

0

null == undefined 是真的

if (arg == null){
    // arg was not passed.
}

代码示例:

var button = document.querySelector("button");

function myFunction(arg){
  if(arg == null){
    alert("argument was not passed.");
  } else {
    alert("argument " + arg + " was passed.");
  }
}
<button onclick="myFunction('foo');">click to fire function w arg</button>
<br><br>
<button onclick="myFunction();">click to fire function w/o arg</button>


-2

我知道这已经过时了,但这是我首选的检查和分配函数默认值的方法:

function testParamFunction(param1, param2) {
    param1 = typeof param1 === 'undefined' ? null : param1;
    param2 = typeof param2 === 'undefined' ? 'default' : param2;

    // exit if the required parameter is not passed
    if (param1 === null) {
        console.error('Required parameter was not passed');
        return;
    }

    // param2 is not mandatory and is assigned a default value so 
    // things continue as long as param1 has a value
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接