编写一个JavaScript函数,根据可选参数更改行为

编写一个JavaScript函数,根据可选参数更改行为,javascript,function,Javascript,Function,我想编写一个函数,它接受一个可选参数,并根据是否提供该参数来更改其行为。这是我想到的第一种方法: function foo(optionalArg) { if (optionalArg) { // do something with the optionalArg } else { // do something different } } 这是最好的方法,还是有更安全/更好的方法 编辑:如果你真的读了这个问题,你会注意到它与一些人声称的

我想编写一个函数,它接受一个可选参数,并根据是否提供该参数来更改其行为。这是我想到的第一种方法:

function foo(optionalArg) {
    if (optionalArg) {
        // do something with the optionalArg
    } else {
        // do something different
    }
}
这是最好的方法,还是有更安全/更好的方法


编辑:如果你真的读了这个问题,你会注意到它与一些人声称的“重复”不同。我知道如何为函数的参数提供默认值;当我第一次尝试自己解决这个问题时,我发现了这些链接。但我不想知道怎么做。我正在寻找根据是否提供参数来更改函数行为的最佳方法。

特殊性通常更好,声明但未提供的参数未定义,因此您可以执行以下操作:

function foo(optionalArg) {
    if (optionalArg !== undefined) {
        // do something with the optionalArg
    } else {
        // do something different
    }
}
使用
if(optionalArg)
将错误值(
0
'
等)视为完全忽略,这可能不是您想要的

如果参数被显式设置为
undefined
(正如t.niese在注释中提到的),此方法仍将返回假阴性,这是罕见的,但也是可能的。您可以检查
arguments.length
来解决这个问题,但是
arguments
在ES6 arrow函数中不可用。对于ES5,使用:

if (arguments.length > 0) { ...
应该这样做,否则您可以使用:

function foo(...args) {
  if (args.length > 0) { ...
并收集您自己的阵列,该阵列将在箭头函数中工作:

(...args) => {
  if (args.length > 0) { ...

你现在的做法很好,但这里有一些提示

1) 在ES6中,如果未提供一个,则可以使用:

function foo(optionalArg = 'something cool') {
   // have your function go about its business as usual
}
2) 除不使用ES6外,同上:

function foo(optionalArg) {
   if (optionalArg === undefined) {
      optionalArg = 'something cool'
   }
   // have your function go about its business as usual
}
3) 请检查您的论点,以避免误报:

function foo(optionalArg) {
    if (optionalArg !== undefined) {
        // do something with the optionalArg
    } else {
        // do something different
    }
}
4) 将较长的块放在else语句中以获得最佳可读性:

function foo(optionalArg) {
   if (optionalArg !== undefined) {
     // do something with the optionalArg
   } else {
     // do something different
     // big
     // huge
     // grandiose
     // epic
   }
}

我希望这有帮助

@Juhana不改变行为,它为可选参数提供默认值。@Juhana这不是重复的。那些帖子没有回答我的问题。有区别。@nicael这不是重复的。那些帖子没有回答我的问题。有区别。@torazaburo这不是重复的。那些帖子没有回答我的问题。这是有区别的。当作为参数传递的值是未定义的时,这会混淆这种情况。针对
参数进行测试。长度
是确定传递了多少参数的更好方法。检查
参数
并不总是可用的,尤其是在ES6 arrow函数中。我正在添加一个使用等效数组的示例,该数组将全面工作。非常好的示例。非常感谢。其他帖子没有回答这个问题,一些人声称这是一个副本。太棒了,帮了很多忙,非常感谢。其他帖子没有回答这个问题,一些人声称这是一个复制品。