我可以始终使用“||”来分配默认参数值吗?

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;
}

优点很明显,我可以同时处理undefinednull参数。

但是,这不适用于默认为 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||undefinedundefined||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;