如果我有一个功能
foo()
我大部分时间都没有参数,但在特殊情况下只有一个参数是
var arg1 = arguments[0];
if (arg1) {
<special case code>
}
在函数内部做一件完全安全的事情?
答案 0 :(得分:1)
是的,这是安全的。 除非您传递false
,""
,0
,null
或undefined
作为参数。最好再检查一下undefined
的值。 (如果你传入undefined
那么强硬!这不是一个有效的论点。)
有3个受欢迎的支票
foo === undefined
:标准检查但某人(邪恶)可能会window.undefined = true
typeof foo !== "undefined"
:检查类型是否安全。foo === void 0
: void 0
返回真实的undefined
但这是首选的
function myFunction(foo) {
if (foo !== undefined) {
...
} else {
...
}
}
答案 1 :(得分:0)
是的,没关系。一个合理的替代方法是命名参数,而不是使用arguments
对象:
function foo(specialArg)
{
if (specialArg)
{
// special case code
}
}
请注意,if(bar)
会测试bar
的真实性。如果您使用任何虚假值(例如foo
,foo(0)
,foo(false)
等)致电foo(null)
,则特殊用例代码将不会在上述功能中执行(或原始功能,就此而言)。您可以将测试更改为
if (typeof specialArg !=== 'undefined')
{
// ...
}
确保在提供参数但执行伪造时执行特殊情况代码。
答案 2 :(得分:0)
你可以这样做:
function foo(arg1){
if (arg1){
// Special case
}
else{
// No argument
}
// Rest of function
}
答案 3 :(得分:0)
只要您充分记录行为,我就不会发现任何问题。
然而,你最好检查一下参数长度,而不是你现在的做法。比如说你叫:
myFunction(0);
永远不会处理这个论点。
如果它是一个可选参数,你可能最好将它作为函数中的命名参数并检查是否传入了定义的值,这取决于你的用例。
答案 4 :(得分:0)
你感兴趣的基本事实是“用0或1个参数调用foo?”。所以我会测试arguments.length
以避免将来评估为false的特殊参数的问题。