Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/475.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我是否可以始终使用“| |”来指定默认参数值? 可选参数_Javascript_Operators_Default Parameters - Fatal编程技术网

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"] =

我经常使用带有可选参数的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;
}
优点很明显,我可以处理
未定义的
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。