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

Gui*_*ser 55 javascript function

我想知道,你能用可选参数创建一个函数吗?

例:

function parameterTest(test)
{
   if exists(test)
   {
     alert('the parameter exists...');
   }
   else
   {
     alert('The parameter doesn\'t exist...');
   }
}
Run Code Online (Sandbox Code Playgroud)

因此,如果您调用,parameterTest()则结果将是消息"参数不存在...".如果你打电话,parameterTest(true)它会返回"参数存在...".

这可能吗?

Den*_*ret 78

这是一种非常频繁的模式.

你可以用它来测试它

function parameterTest(bool) {
  if (bool !== undefined) {
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用以下表单之一调用您的函数:

 parameterTest();
 parameterTest(someValue);
Run Code Online (Sandbox Code Playgroud)

注意不要经常出现测试错误

if (!bool) {
Run Code Online (Sandbox Code Playgroud)

因为您无法区分未提供的值false,0"".

  • @griffin你是对的.我们应该停止使用`undefined`,它可能随时改变!不妨停止使用`Object`和`Date`,有人可能已经篡改了那些,你永远不应该信任`document.createElement`,它可以被覆盖! (13认同)
  • @griffin如果有人在他们的代码中写了`var undefined`,他们应该受苦.`window.undefined`是不可写的,因为`window.infinity`和`window.NaN`是相同的 - 它们应该用于表示规范定义的各自值. (5认同)
  • @griffin简而言之:`undefined`与`Object`具有完全相同的状态:它是全局对象的不可写(自ES5)属性,由规范定义,如果你遮蔽它就是你的错.没有理由使用一个而不是另一个.此外,如果您用户编写的页面确实重新定义了一个或另一个页面,则greasemonkey _still_通过为每个用户提供单独的全局范围来保护您免受此攻击. (4认同)
  • -1表示=== undefined - 在你的代码之前尝试var undefined = true并看看会发生什么...正确检查将是typeof book ==='undefined' (3认同)
  • `typeof(bool)`应该是`typeof bool`,对吗? (2认同)
  • @griffin绝对,`undefined`是一个局部变量.这就是为什么[它是全局对象的属性](http://es5.github.io/#x15.1.1.3),显然[`Object`不能被覆盖](http://jsh.zirak .ME/185i9) (2认同)
  • `Object`不是保留关键字,从来没有.它是全局范围内的已定义属性,恰好与构造函数`{}`一致.并且`window.undefined`可以通过两种方式覆盖:1)通过您自己的代码 - 然后您应该得到它,或2)通过您编写脚本的页面 - 但IE8不支持用户脚本,而Firefox和Chrome都使用ES5. (2认同)
  • @griffin如果你热衷于支持netscape,那么一定要担心未定义不是保留字.... (2认同)
  • 再次投票; 对于阅读这些评论的任何人:我们聊了一下这个主题,似乎IE8中已经存在`undefined`(基于ES3的JScript 1.5),这意味着这种检查方式实际上很好.但是,如果要检查参数计数,则应使用arguments.length来防止由于某些内容作为未定义传递而导致的漏洞(两个不同的用例). (2认同)

Joh*_*han 10

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


Joh*_*son 7

在JavaScript中,如果您忽略提供参数,则默认为undefined.

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

正如您所说,您可以检查参数是否存在,然后编写一个可以使用参数的函数.但是,JavaScript Garden(一个很好的资源)建议远离typeof大多数其他情况,因为它的输出几乎没用(查看typeof结果表).

  • 该链接说 typeof 仅对这种情况有用,这对于这个问题来说已经足够了。 (2认同)

ZPK*_*ski 6

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

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

  • 这对我来说是正确的答案,因为我需要区分根本没有传递的值和将 undefined 传递给函数。其他答案不考虑传递未定义。 (2认同)