【问题标题】:Is there a slick way to do undefined coalescence in JavaScript?有没有一种巧妙的方法可以在 JavaScript 中进行未定义的合并?
【发布时间】:2016-02-28 20:38:49
【问题描述】:

我正在寻找一种在 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 时“停止”(在未定义或 null 时合并,但不是 false)。我正在为其执行此操作的应用程序类似于以下内容:

var threshold = argv[2] ?? process.env.threshold ?? config.threshold ?? 0.3;
var verbose = isTrue(argv[3] ?? process.env.verbose ?? config.verbose ?? false);

我正在寻找一种 slick 方法来做到这一点,类似于 || 运算符,而不是:

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”阈值,并跳过任何未定义或空值。

【问题讨论】:

    标签: javascript null undefined null-coalescing-operator


    【解决方案1】:

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

    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 函数是微不足道的。

    还请注意,如果不支持将评估上述参数的 所有 的合并运算符 - 您将失去 ||?? 短路的优势,其中右手如果返回左侧表达式,则不计算表达式。

    【讨论】:

    • 嗯,如果添加函数是唯一的方法,我可以将自己的空合并运算符定义为 ?? 吗?如果不是,我的符号选择是什么?
    • @Ehryk 您不能在 JS 中定义自己的运算符。请参阅答案更新以了解改进的功能。
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2015-11-02
    • 1970-01-01
    相关资源
    最近更新 更多