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)作为主要的默认参数模式,还是我应该保留并在我的代码中使用的巧妙技巧?
只是一个猜测,但Doug Crockford不鼓励在"JavaScript:好的部分"中使用switch语句.他的逻辑是switch语句是bug的常见来源,因为在使用"fall through"逻辑时很难找到它们.在触发案例时很容易看到,但通常很难确定结果集中的每个案例是否都已被涵盖,特别是如果它不是您的代码.
由于问题已经更新,这确实是一个意见问题.许多人建议避免使用许多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)
| 归档时间: |
|
| 查看次数: |
1114 次 |
| 最近记录: |