Javascript 我是否可以始终使用“| |”来指定默认参数值? 可选参数
我经常使用带有可选参数的JavaScript函数。 而不是像这样写一张长支票:Javascript 我是否可以始终使用“| |”来指定默认参数值? 可选参数,javascript,operators,default-parameters,Javascript,Operators,Default Parameters,我经常使用带有可选参数的JavaScript函数。 而不是像这样写一张长支票: if(param === null || param === undefined){ param = {}; } 我通常使用以下语法: function doSomething(optionalParam, optionalCallback, optionalFlag){ optionalParam = optionalParam || {}; optionalParam["xyz"] =
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;
}
优点很明显,我可以处理未定义的
和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 | | |未定义的和未定义的| | | null
之间的区别)应该属于一个单独的问题,所以我将其删除。一般的答案是您不能使用
parameter = parameter || default;
如果用户能够传递错误的显式参数,则应优先于默认参数。在这种情况下,您需要明确测试未定义的:
parameter = typeof parameter == "undefined" ? default : parameter;
如果用户应该能够传递一个显式的未定义的值并使其优先(这是一件非常反常的事情),那么您需要测试参数.length
以确定传递了多少个参数,因此您只能默认剩余的参数。一般的答案是您不能使用
parameter = parameter || default;
如果用户能够传递错误的显式参数,则应优先于默认参数。在这种情况下,您需要明确测试未定义的:
parameter = typeof parameter == "undefined" ? default : parameter;
如果用户应该能够传递一个显式的未定义的值并使其优先(这是一件非常反常的事情),那么您需要测试参数.length
以确定传递了多少个参数,因此您只能默认剩余的参数。为什么以下两个表达式返回不同的值
- null | |未定义//计算结果为未定义
- 未定义的| | null//计算结果为null
somethine | | somethingElse是一个表达式,意思是它将始终返回一个值,要么返回第一个真实值,要么返回最后一个值。例如,false | | 17
是17。null和undefined都是falsy,因此在这两种情况下,| |将返回最后一个值
我能在所有这些情况下使用| |吗
||有时你可以做一些你意想不到的事情
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;
}
为什么以下两个表达式返回不同的值
- null | |未定义//计算结果为未定义
- 未定义的| | null//计算结果为null
somethine | | somethingElse是一个表达式,意思是它将始终返回一个值,要么返回第一个真实值,要么返回最后一个值。例如,false | | 17
是17。null和undefined都是falsy,因此在这两种情况下,| |将返回最后一个值
我能在所有这些情况下使用| |吗
||有时你可以做一些你意想不到的事情
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;
}
只要用于测试是否存在参数的表达式在提供参数的所有情况下都返回true,就可以使用逻辑OR运算符
someFlag = someFlag || true; //Will never evaluate to false.
上面的示例不起作用,因为我可以提供参数false
,用于测试参数是否存在的表达式(在本例中仅为someFlag
)仍将计算为false,这意味着未指定参数
因此,您需要将代码修改为:
someFlag = (typeof someFlag === 'boolean') ? someFlag : true;
只要用于测试是否存在参数的表达式在提供参数的所有情况下都返回true,就可以使用逻辑OR运算符
someFlag = someFlag || true; //Will never evaluate to false.
上面的示例不起作用,因为我可以提供参数false
,用于测试参数是否存在的表达式(在本例中仅为someFlag
)仍将计算为false,这意味着未指定参数
因此,您需要将代码修改为:
someFlag = (typeof someFlag === 'boolean') ? someFlag : true;
您最好研究Javascript中的“falsy”和“truthy”值。null
和undefined
都是虚假的,这就是为什么您会在问题的底部列出这些行为。为什么您认为默认值为true
时它不起作用?如果未设置someFlag
,则someFlag | | true
将返回true
,这是正确的默认值。@Barmar如果用户通过false
,false | | true
将始终计算为true。我认为Maja的意思是不能以这种方式设置bool输入的默认值。如果用户通过了false
,检查将始终将其转换为true。您最好研究Javascript中的“falsy”和“truthy”值。null
和undefined
都是虚假的,这就是为什么您会在问题的底部列出这些行为。为什么您认为默认值为true
时它不起作用?如果未设置someFlag
,则someFlag | | true
将返回true
,这是正确的默认值。@Barmar如果用户通过false
,false | | true
将始终计算为true。我认为Maja的意思是不能以这种方式设置bool输入的默认值。如果用户通过了false
,检查将始终将其转换为true。