以下是我使用||
运算符在参数为undefined
时指定默认值的示例。
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
但是,操作将被忽略,因此始终分配默认值。我怎样才能解决这个问题?在JSFiddle上 - 您必须打开控制台才能看到输出。
答案 0 :(得分:2)
当你传入false时,你有这个
flag: false || true;
如果您知道||
如何运作,如果左侧是假的,那么它将采取右侧。
您需要检查未定义,因为false为FALSE
flag: flag!==undefined ? flag : true;
其他选项是检查参数长度
flag: arguments.length ? flag : true;
答案 1 :(得分:1)
||
不 是'如果是未定义的运算符',虽然它的语义允许它以某种方式使用似乎就像那样做。它是 OR 运算符。当且仅当左侧为“falsey”时,它才会评估右侧 - 也就是说,当转换为布尔值时,它是false
。来自MDN:
如果可以转换为true,则返回
expr1
;否则,返回expr2
。因此,当与布尔值一起使用时,如果任一操作数为||
,true
将返回true
;如果两者都是false
,则返回false
。
尝试使用更明确的测试:
output({
flag: (typeof flag === "undefined") ? true : flag;
});
答案 2 :(得分:1)
你应该这样做:
flag: typeof flag === 'undefined' ? true : !!flag;
||
不适合您想要使用它。如果它是真的,它将返回第一个操作数的结果,否则返回第二个操作数的结果。例如,false || true
会返回true
。
如果true
为flag
,我的示例将返回undefined
,并返回flag
投放到布尔值(因此true
或false
)否则 - 所以你最终得到一个干净的旗帜,没有技巧:)。
还有一个提示:不要使用你不理解的技巧:)。它们会导致奇怪的错误。
答案 3 :(得分:0)
您应该检查类型
main = function (flag) {
output({
flag: (flag===undefined)?true:flag;
});
}