JavaScript中的可选参数

Ric*_*ard 27 javascript

为可选参数分配默认值的好方法是什么?

背景

我正在玩JavaScript中的可选参数,以及如果未指定参数则分配默认值的想法.我的方法接受两个参数,后者我认为是可选的,如果未指定则默认为false.我的方法看起来像这样......

// selects the item, appropriately updating any siblings
// item to select [, toggle on / off]
this.selectItem = function(item, toggle)
{
    toggle = toggle && typeof toggle === 'boolean';
    if (toggle)
    {
       // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

测试

此jsFiddle上运行一些测试后,使用以下主体进行默认值分配:

function checkParamIsBoolean(param)
{
    param = param && typeof param === 'boolean';
}

checkParamIsBoolean('me'); // boolean
checkParamIsBoolean([]); // boolean
checkParamIsBoolean(true); // boolean
checkParamIsBoolean(false); // boolean
checkParamIsBoolean(1 == 1); // boolean
checkParamIsBoolean(1); // boolean
checkParamIsBoolean(null); // object
checkParamIsBoolean(undefined); // undefined
?
Run Code Online (Sandbox Code Playgroud)

尽可能地,结果会有所不同,并且不是所希望的.

预期

null= false
undefined=false

实际

null= object
undefined=undefined

摘要

是否有任何替代方法可以将默认值分配给可选参数(如果未指定); 最好是_toggle用作参数然后var toggle在方法中分配值吗?

Mar*_*mro 23

更好的解决方案是使用包装在对象中的命名参数.它可以保持代码清洁,并在复杂功能的情况下防止错误(具有许多默认和非默认参数).否则你需要记住参数的顺序,并根据存在的参数类型(这就是你要做的事情)分配默认值.

该方法是传递params jQuery和jQuery插件的主要方法.

function test(options) { 

  // set up default options 
  var defaults = { 
    param1:      'test', 
    param2:      100
  }; 

  // combine options with default values
  var options = $.extend({}, defaults, options); // If you're not using jQuery you need different function here

  alert(options.param1)
  alert(options.param2)

}

test({'param2': 200}) // Call the function with just the second param
Run Code Online (Sandbox Code Playgroud)

  • 我不知道我是否是唯一一个,但当评论"如果你没有使用Jquery ......"开始滚动屏幕时,我完全期待阅读"......你做错了. " 当我滚动过来的时候. (9认同)
  • 我确信@JHixson认为这很有趣.荡. (3认同)

sbg*_*ran 14

您可以在代码中使用此构造作为可选参数:

//...
optionalParam = optionalParam || 'some default value';
Run Code Online (Sandbox Code Playgroud)

在您的具体实践中,它将是这样的:

this.selectItem = function(item, toggle)
{
    toggle = toggle || false;
   // ...
}
Run Code Online (Sandbox Code Playgroud)

但在你的情况下你可以直接在if语句中使用toogle(可选参数)(因为你只想检查它的存在.或者你可以选择强制执行布尔值这样的toogle = !!toogle(双重否定).