使用带有fallthrough的开关来处理Javascript中的默认参数是一个好主意吗?

hug*_*omg 28 javascript default-value argument-passing

我最近了解到,您可以使用带有fallthrough的简洁switch语句在Javascript中设置默认参数值:

function myFunc(arg1, arg2, arg3) {
    //replace unpassed arguments with their defaults:
    switch (arguments.length) {
        case 0 : arg1 = "default1";
        case 1 : arg2 = "default2";
        case 2 : arg3 = "default3";
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经成长为喜欢它,因为它不仅非常短,而且它也基于实际传递的参数而工作,而不依赖于一个特殊的值类(null,falsy等)作为占位符,就像在更传统的版本:

function myFunc(arg1, arg2, arg3){
    //replace falsy arguments with their defaults:
    arg1 = arg1 || "default1";
    arg2 = arg2 || "default2";
    arg3 = arg3 || "default3";
}
Run Code Online (Sandbox Code Playgroud)

我看到使用开关的版本之后我的初衷是我应该考虑在||版本上"默认"使用它.

开关虽然不会长得多,但它具有更加"稳健"的优点,因为它不关心参数的类型.在一般情况下,每当我必须使用默认参数创建函数时,不必担心所有伪值('',0,null,false ...)会发生什么,这听起来是个好主意.

然后,我会保留arg = arg || x实际情况,我想检查真实性,而不是将其重新用作参数默认的一般规则.

但是,当我进行代码搜索时,我发现这种模式的例子很少,所以我不得不戴上我的怀疑帽.为什么我没有找到这个成语的更多例子?

  • 它现在是众所周知的吗?
  • 我搜索得不够好吗?我是否因为大量误报而感到困惑?
  • 是否有某些东西使它不如替代品?

我(以及一些评论)可以考虑避免的一些原因switch(arguments.length):

  • 使用通过对象文字传递的命名参数非常灵活且可扩展.也许更多参数可以选择的地方是使用它?

  • 也许大多数时候,我们希望检查truthyness?使用一类值作为占位符也允许默认参数出现在中间而不是仅在结尾:myFunc('arg1', null, 'arg3')

  • 也许大多数人只是喜欢非常短暂arg = arg || "default"而且大部分时间我们只是不关心虚假的价值观?

  • 也许访问arguements是邪恶的/无形的?

  • 也许这种开关案例的落后有一个我没想过的坏部分?

这些缺点是否足以避免使用switch(arguments.length)作为主要的默认参数模式,还是我应该保留并在我的代码中使用的巧妙技巧?

Ted*_*Ted 6

只是一个猜测,但Doug Crockford不鼓励在"JavaScript:好的部分"中使用switch语句.他的逻辑是switch语句是bug的常见来源,因为在使用"fall through"逻辑时很难找到它们.在触发案例时很容易看到,但通常很难确定结果集中的每个案例是否都已被涵盖,特别是如果它不是您的代码.


Nic*_*nis 6

由于问题已经更新,这确实是一个意见问题.许多人建议避免使用许多javascript功能,例如switch和ternary.这就是为什么没有关于其中一些功能的大量信息的原因.

提出建议的原因是许多人错过了使用这些功能并在代码中产生问题.这些错误有时很难被发现,其他人很难理解你的代码在做什么(特别是那些不熟悉javascript或新程序员的人).

因此,如果您喜欢这样做,并且您并不担心任何从事代码工作的人的意见(或技能水平).无论如何,你的方法都会奏效.我偶尔会使用switch语句,虽然我认为它不是"好"或"坏",但很难找到需要它的情况.

你问我如何在没有if-else链的情况下解决这个问题:

function myFunc(args) {
    var allArgs = {
        arg1:"default1",
        arg2:"default2",
        arg3:"default3"
    };
    for (var key in args) {
        allArgs[key] = args[key];        
    }
}
myFunc({arg1:null, arg3:'test'})
Run Code Online (Sandbox Code Playgroud)