我有一个带有可变参数的函数,类似于
function fn(...args) {
let str, arr, obj;
if (args.length == 1) {
if (typeof args[0] == 'object') {
obj = args[0];
} else {
str = args[0];
}
} else if (args.length == 2) {
str = args[0];
if (typeof args[1] == 'object') {
obj = args[1];
} else {
arr = args[1];
}
} else if (args.length == 3) {
[str, arr, obj] = args;
}
}
API就是
fn()
fn(String str)
fn(Object obj)
fn(String str, Array arr)
fn(String str, Object obj)
fn(String str, Array arr, Object obj)
故意在类型上松散(例如,某些参数可能未定义)。
这是浏览器代码,相当紧凑。这肯定是可行的,但是有更好的食谱,更少的冗长和更易于维护吗?任何节点或通用JS库能够在足迹和依赖性方面保持适度的同时完成脏工作吗?
答案 0 :(得分:2)
"问题"我看到这一点,你不仅要使用可变参数进行重载,还要重载参数 types 。这种组合导致了一个混乱的实施,从长远来看只会伤害你。
这是一种使用辅助功能编写它的不同方式,但你仍然处于痛苦的世界(更多下面)。
function fn(...args) {
function aux(str, arr, obj) {
// this function will always have str, arr, and obj
}
// Warning: this has an error anyway because (typeof []) is also 'object'
switch (args.length) {
case 1: return typeof args[0] === 'object'
? aux(null, null, args[0])
: aux(args[0], null, null);
case 2: return typeof args[0] === 'object'
? aux(args[0], null, args[1])
: aux(args[0], args[1], null);
case 3: return aux(args[0], args[1], args[2]);
}
}
通过上述实现,您可以使用 5 独特的方式来调用您的函数,所有这些方法都是可以接受和适当的。
<强>缺点强>
typeof []
将返回'object'
而不是&#39; array
&#39;就像你可能在想。您将不得不编写大量的角落案例,以确保您正确检测所有类型。 JavaScript不是一种打字语言,因此尝试根据typeof
协商行为,因为您的首选检测机制将导致各种令人头疼的问题。所有这些额外的代码意味着更多的错误概率,更多的代码需要维护,软件的整体质量最终会受到影响。<强>赞成强>
开发人员经常犯的错误,因为一种语言允许某种思维方式,无论他们提出什么代码,只要它编译/执行,就可以了。
这是一个非常大的误解,并且经常为什么有经验的开发人员更欣赏/偏爱更严格和更多限制的语言。
无论如何,祝你好运。