我正在寻找一种在javascript中使用布尔值进行未定义合并的方法。我习惯做以下事情,比如正整数:
var x = i1 || i2 || i3 || i4;
这是一种“光滑”的方式,但不是我所追求的。我在C#中寻找等价的??
。
var b1 = undefined;
var b2 = null;
var b3 = false;
var b4 = true;
var x = b1 || b2 || b3 || b4; //x == true (b4)
但是,我希望上面的'停止'为false(在undefined或null上合并,但不是false)。我正在执行此操作的应用程序类似于以下内容:
var threshold = argv[2] ?? process.env.threshold ?? config.threshold ?? 0.3;
var verbose = isTrue(argv[3] ?? process.env.verbose ?? config.verbose ?? false);
我正在寻找一种光滑的方法,类似于||
运算符,而不是:
var verbose = false;
if (config.verbose !== undefined && config.verbose !== null) verbose = isTrue(config.verbose);
if (process.env.verbose !== undefined && process.env.verbose !== null) verbose = isTrue(process.env.verbose);
if (argv[3] !== undefined && argv[3] !== null) verbose = isTrue(argv[3]);
同样,我希望阈值接受'0'阈值,并跳过任何未定义或空值。
答案 0 :(得分:3)
我能想到的最简单的方法(不添加额外的功能)是:
var x = [b1, b2, b3, b4].find(x => x !== null && x !== undefined);
如果要反复使用它,请定义一个为您完成所有工作的功能:
function coalesce() {
return [].find.call(arguments, x => x !== null && x !== undefined);
}
var x = coalesce(b1, b2, b3, b4);
注意:上面使用的ES2015语法和功能!重写“旧”语法并为旧浏览器填充Array.prototype.any
函数是微不足道的。
另请注意,如果没有对合并运算符的本机支持,将评估所有上述参数 - 您将失去||
或??
短路的优势其中如果返回左手表达式,则不评估右手表达。