Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/443.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.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_Null_Undefined_Null Coalescing Operator - Fatal编程技术网

有没有一种巧妙的方法可以在JavaScript中进行未定义的合并?

有没有一种巧妙的方法可以在JavaScript中进行未定义的合并?,javascript,null,undefined,null-coalescing-operator,Javascript,Null,Undefined,Null Coalescing Operator,我正在寻找一种在javascript中使用布尔值进行未定义合并的方法。我习惯于做以下事情,比如说,正整数: var x = i1 || i2 || i3 || i4; 这是一种“圆滑”的方式,但不是我想要的。我正在寻找C#中与?等效的代码 但是,我希望上面的语句在false时“停止”(在未定义或null时合并,但不是false)。我为其执行此操作的应用程序类似于以下内容: var threshold = argv[2] ?? process.env.threshold ?? config.th

我正在寻找一种在javascript中使用布尔值进行未定义合并的方法。我习惯于做以下事情,比如说,正整数:

var x = i1 || i2 || i3 || i4;
这是一种“圆滑”的方式,但不是我想要的。我正在寻找C#中与
等效的代码

但是,我希望上面的语句在false时“停止”(在未定义或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”阈值,并跳过任何未定义或空值

我能想到的最巧妙的方法(不添加额外功能)是:

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
函数对于旧浏览器来说是很简单的


还要注意的是,如果没有对合并运算符的本机支持,那么上面的所有参数都将被计算-您将失去
|
??
短路的优势,其中如果返回左手表达式,则不会计算右手表达式。

Hmm,如果添加函数是唯一的方法,我是否可以将自己的空合并运算符定义为
?如果没有,我可以选择什么符号?@Ehryk您不能在JS中定义自己的运算符。有关改进的功能,请参见答案更新。
function coalesce() {
    return [].find.call(arguments, x => x !== null && x !== undefined);
}

var x = coalesce(b1, b2, b3, b4);