有几种不同的方法可以检查参数是否传递给函数。除了您在(原始)问题中提到的两个之外 - 检查arguments.length
或使用||
运算符提供默认值 - 还可以显式检查参数undefined
via argument2 === undefined
or typeof argument2 === 'undefined'
如果一个人偏执(见评论)。
使用||
运算符已成为标准做法 - 所有酷孩子都会这样做 - 但要小心:如果参数计算结果为,则将触发默认值false
,这意味着它实际上可能是undefined
, null
, false
, 0
, ''
(或任何其他Boolean(...)
回报false
).
所以问题是何时使用哪种检查,因为它们都会产生略有不同的结果。
检查arguments.length
表现出“最正确”的行为,但如果有多个可选参数,则可能不可行。
测试为undefined
是下一个“最佳” - 如果使用显式调用该函数,它只会“失败”undefined
value,很可能应该以与省略参数相同的方式对待。
使用||
即使提供了有效的参数,运算符也可能会触发默认值的使用。另一方面,它的行为实际上可能是期望的。
总结一下:仅当您知道自己在做什么时才使用它!
在我看来,使用||
如果有多个可选参数并且不想传递对象文字作为命名参数的解决方法,这也是一种可行的方法。
另一种提供默认值的好方法是使用arguments.length
可以通过 switch 语句的标签来实现:
function test(requiredArg, optionalArg1, optionalArg2, optionalArg3) {
switch(arguments.length) {
case 1: optionalArg1 = 'default1';
case 2: optionalArg2 = 'default2';
case 3: optionalArg3 = 'default3';
case 4: break;
default: throw new Error('illegal argument count')
}
// do stuff
}
这样做的缺点是程序员的意图(视觉上)不明显并且使用“幻数”;因此,它可能容易出错。