JavaScript 中是否有“空合并”运算符?

Javascript 中是否有空合并运算符?

例如,在C#中,我可以这样做:

String someString = null;
var whatIWant = someString ?? "Cookies!";

我能为Javascript找到的最好的近似值是使用条件运算符:

var someString = null;
var whatIWant = someString ? someString : 'Cookies!';

恕我直言,这有点恶心。我能做得更好吗?


答案 1

更新

JavaScript 现在支持空合并运算符 (??)。)。当左侧操作数为 or 时,它返回右侧操作数,否则返回左侧操作数。nullundefined

旧答案

请在使用前检查兼容性。


与 C# 空合并运算符 () 等效的 JavaScript 正在使用逻辑 OR ():??||

var whatIWant = someString || "Cookies!";

在某些情况下(在下面澄清),行为与C#的行为不匹配,但这是在JavaScript中分配默认值/替代值的一般,简洁的方式。


澄清

无论第一个操作数的类型如何,如果将其转换为布尔值,则赋值将使用第二个操作数。请注意以下所有情况:false

alert(Boolean(null)); // false
alert(Boolean(undefined)); // false
alert(Boolean(0)); // false
alert(Boolean("")); // false
alert(Boolean("false")); // true -- gotcha! :)

这意味着:

var whatIWant = null || new ShinyObject(); // is a new shiny object
var whatIWant = undefined || "well defined"; // is "well defined"
var whatIWant = 0 || 42; // is 42
var whatIWant = "" || "a million bucks"; // is "a million bucks"
var whatIWant = "false" || "no way"; // is "false"

答案 2
function coalesce() {
    var len = arguments.length;
    for (var i=0; i<len; i++) {
        if (arguments[i] !== null && arguments[i] !== undefined) {
            return arguments[i];
        }
    }
    return null;
}

var xyz = {};
xyz.val = coalesce(null, undefined, xyz.val, 5);

// xyz.val now contains 5

此解决方案的工作方式与 SQL 合并函数类似,它接受任意数量的参数,如果参数中没有一个参数具有值,则返回 null。它的行为类似于C#?运算符,从某种意义上说,“”、false 和 0 被视为 NOT NULL,因此计为实际值。如果您来自.net背景,这将是最自然的感觉解决方案。