我可以始终使用“||”来分配默认参数值吗?
Can I always use `||` to assign default parameter values?
可选参数
我经常使用带有可选参数的 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.
Return 值
这是我使用该语法的另一个示例:
function getValueOfIndex(idx){
return anArray[idx] || null; //Returns null if the index is out of bounds
}
我的问题:
||
运算符在我的用例中如何工作?
- 我可以对所有这些情况使用
||
吗?
- 有什么理由不使用它吗?
- 是否有任何其他类型或值会导致此语法失败?
编辑: 我认识到我的最后一点(null||undefined
和 undefined||null
之间的区别)应该属于一个单独的问题,所以我删除了它。
一般的答案是你不能使用
parameter = parameter || default;
如果用户应该能够传递一个显式的错误参数,并且应该优先于默认值。在这种情况下,您需要明确测试 undefined
:
parameter = typeof parameter == "undefined" ? default : parameter;
如果用户应该能够传递一个明确的 undefined
值并优先考虑该值(这是非常不正常的事情),您将需要测试 arguments.length
以确定有多少参数已传递,因此您可以仅默认其余部分。
为什么下面两个表达式 return 的值不同?
- 无 || undefined //计算结果为undefined
- 未定义 || null //计算结果为 null
某事|| somethingElse 是一个表达式,意味着它将 always return 一个值,要么是第一个真值,要么是最后一个值。例如 false || 17
是 17。null 和 undefined 都是假的,所以在这两种情况下,||将 return 最后一个值。
我可以用吗||对于所有这些情况?
||有时可以做一些你意想不到的事情
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;
}
可以使用逻辑 OR 运算符只要用于测试参数是否存在的表达式returns对于提供参数的所有情况都为真.
someFlag = someFlag || true; //Will never evaluate to false.
上面的示例不起作用,因为我可以提供参数 false
并且用于测试参数是否存在的表达式(在本例中只是 someFlag
)仍将计算为false,暗示未指定参数。
因此您需要将代码修改为:
someFlag = (typeof someFlag === 'boolean') ? someFlag : true;
可选参数
我经常使用带有可选参数的 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.
Return 值
这是我使用该语法的另一个示例:
function getValueOfIndex(idx){
return anArray[idx] || null; //Returns null if the index is out of bounds
}
我的问题:
||
运算符在我的用例中如何工作?
- 我可以对所有这些情况使用
||
吗? - 有什么理由不使用它吗?
- 是否有任何其他类型或值会导致此语法失败?
编辑: 我认识到我的最后一点(null||undefined
和 undefined||null
之间的区别)应该属于一个单独的问题,所以我删除了它。
一般的答案是你不能使用
parameter = parameter || default;
如果用户应该能够传递一个显式的错误参数,并且应该优先于默认值。在这种情况下,您需要明确测试 undefined
:
parameter = typeof parameter == "undefined" ? default : parameter;
如果用户应该能够传递一个明确的 undefined
值并优先考虑该值(这是非常不正常的事情),您将需要测试 arguments.length
以确定有多少参数已传递,因此您可以仅默认其余部分。
为什么下面两个表达式 return 的值不同?
- 无 || undefined //计算结果为undefined
- 未定义 || null //计算结果为 null
某事|| somethingElse 是一个表达式,意味着它将 always return 一个值,要么是第一个真值,要么是最后一个值。例如 false || 17
是 17。null 和 undefined 都是假的,所以在这两种情况下,||将 return 最后一个值。
我可以用吗||对于所有这些情况?
||有时可以做一些你意想不到的事情
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;
}
可以使用逻辑 OR 运算符只要用于测试参数是否存在的表达式returns对于提供参数的所有情况都为真.
someFlag = someFlag || true; //Will never evaluate to false.
上面的示例不起作用,因为我可以提供参数 false
并且用于测试参数是否存在的表达式(在本例中只是 someFlag
)仍将计算为false,暗示未指定参数。
因此您需要将代码修改为:
someFlag = (typeof someFlag === 'boolean') ? someFlag : true;