我经常使用带有可选参数的JavaScript函数。 而不是写这样的长支票:
if(param === null || param === undefined){
param = {};
}
我通常使用以下语法:
function doSomething(optionalParam, optionalCallback, optionalFlag){
optionalParam = optionalParam || {};
optionalParam["xyz"] = "value"; //Won't fail if the user didn't pass a value
optionalCallback = optionalCallback || function(){};
optionalCallback(); //If I need the function on 20 places, I don't have to insert a typeof-check everywhere
optionalFlag = optionalFlag || false;
}
优点很明显,我可以处理undefined
和null
参数。
但是,这对于默认为true的可选标志不起作用:
someFlag = someFlag || true; //Will never evaluate to false.
这是我使用该语法的另一个例子:
function getValueOfIndex(idx){
return anArray[idx] || null; //Returns null if the index is out of bounds
}
||
运算符如何在我的用例中工作?
||
吗? 修改:我认识到我的最后一点(null||undefined
和undefined||null
之间的差异)应该属于一个单独的问题,所以我将其删除了。
答案 0 :(得分:2)
一般的答案是你不能使用
parameter = parameter || default;
如果用户应该能够传递一个假的参数,那么该参数应该优先于默认参数。在这种情况下,您需要明确测试undefined
:
parameter = typeof parameter == "undefined" ? default : parameter;
如果用户应该能够传递显式undefined
值并且优先级(这是一个非常有悖常规的事情),那么您需要测试arguments.length
以确定有多少参数传递,所以你只能默认余数。
答案 1 :(得分:1)
为什么以下两个表达式会返回不同的值?
某事|| somethingElse是一个表达式,意味着总是返回一个值,或者是第一个值,否则就是最后一个值。例如false || 17
是17. null和undefined都是假的,因此在两种情况下都是||将返回最后一个值。
我可以使用||对于所有这些情况?
||有时可以做一些你不会期待的事情
function thisIsUnexpected (a) {
a = a || "other value";
reurn a;
}
thisIsUnexpected(); // will return "other value";
// it can fail when you pass in a falsy value
thisIsUnexpected(false); // you would want it to return false, yet it will return "other value"
要获得正确的行为,您需要使用如下的三元表达式。这绝不会失败。
function thisIsExpected (a) {
a = (a === undefined) ? "other value" : a;
reurn a;
}
答案 2 :(得分:1)
逻辑OR运算符可以用,只要用于测试参数存在的表达式对于提供参数的所有情况都返回true 。
someFlag = someFlag || true; //Will never evaluate to false.
上面的示例不起作用,因为我可以提供参数false
,并且用于测试参数是否存在的表达式(在这种情况下只是someFlag
)仍将评估为false,暗示没有指定参数。
因此您需要将代码修改为:
someFlag = (typeof someFlag === 'boolean') ? someFlag : true;