Javascript:如果未定义的运算符不工作,则分配

Javascript:如果未定义的运算符不工作,则分配,javascript,undefined,default-value,Javascript,Undefined,Default Value,下面是一个示例,如果参数是未定义的,我使用|运算符指定默认值 output = function (data) { console.log("data.flag =", data.flag); } main = function (flag) { output({ flag: flag || true; }); } main(true); // data.flag = true main(false); // data.flag = true

下面是一个示例,如果参数是未定义的,我使用
|
运算符指定默认值

output = function (data) {
    console.log("data.flag =", data.flag);
}

main = function (flag) {
    output({
        flag: flag || true;
    });
}

main(true);  // data.flag = true 
main(false); // data.flag = true 

但是,该操作将被忽略,因此始终会指定默认值。我怎样才能解决这个问题?此处打开-您必须打开控制台才能查看输出。

当您传入false时,您将看到此消息

flag: false || true;
如果你知道
|
是如何工作的,如果左侧是错误的,那么它将占据右侧

您需要检查未定义,因为false为false

flag: flag!==undefined ? flag : true;
另一个选项是检查参数长度

flag: arguments.length ? flag : true;

当你通过false时,你有这个

flag: false || true;
如果你知道
|
是如何工作的,如果左侧是错误的,那么它将占据右侧

您需要检查未定义,因为false为false

flag: flag!==undefined ? flag : true;
另一个选项是检查参数长度

flag: arguments.length ? flag : true;

||
不是一个“未定义的赋值运算符”,尽管它的语义允许它以某种方式使用,使它看起来像是这样。是OR接线员。当且仅当左侧为“Falsy”时,它才会计算右侧,也就是说,当转换为布尔值时,它为
false
。发件人:

如果可以转换为true,则返回
expr1
;否则,返回
expr2
。因此,当与布尔值一起使用时,
|
如果任一操作数为
true
,则返回
true
;如果两者都是
false
,则返回
false

尝试使用更明确的测试:

output({
    flag: (typeof flag === "undefined") ? true : flag;
});

||
不是一个“未定义的赋值运算符”,尽管它的语义允许它以某种方式使用,使它看起来像是这样。是OR接线员。当且仅当左侧为“Falsy”时,它才会计算右侧,也就是说,当转换为布尔值时,它为
false
。发件人:

如果可以转换为true,则返回
expr1
;否则,返回
expr2
。因此,当与布尔值一起使用时,
|
如果任一操作数为
true
,则返回
true
;如果两者都是
false
,则返回
false

尝试使用更明确的测试:

output({
    flag: (typeof flag === "undefined") ? true : flag;
});

你应该这样做:

flag: typeof flag === 'undefined' ? true : !!flag;
|
不适合您想要使用它。它将返回第一个操作数的结果(如果为真),否则返回第二个操作数。例如
false | | true
返回
true

我的示例将返回
true
,如果
flag
undefined
,并将
flag
转换为布尔值(因此
true
false
),否则-因此您将得到一个干净的标志,没有技巧:)


还有一个提示:不要使用你不懂的技巧:)。它们会导致奇怪的错误。

您应该这样做:

flag: typeof flag === 'undefined' ? true : !!flag;
|
不适合您想要使用它。它将返回第一个操作数的结果(如果为真),否则返回第二个操作数。例如
false | | true
返回
true

我的示例将返回
true
,如果
flag
undefined
,并将
flag
转换为布尔值(因此
true
false
),否则-因此您将得到一个干净的标志,没有技巧:)

还有一个提示:不要使用你不懂的技巧:)。它们会导致奇怪的错误。

您应该检查类型

main = function (flag) {
    output({
        flag: (flag===undefined)?true:flag;
    });
}
你应该检查一下类型

main = function (flag) {
    output({
        flag: (flag===undefined)?true:flag;
    });
}

如果
标志
为布尔值,则
标志| |真
将始终等于
标志| |真
将始终等于
如果
标志
为布尔值。您知道
是否有一个包装函数(标记的类型==“未定义”)?真:国旗在公共库中,例如您知道是否有
的包装函数(typeof flag==“undefined”)?真:国旗在公共库中,例如