JavaScript中是否存在“null coalescing”操作符?

Javascript中有一个空合并运算符吗?

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

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

我能find的最好的近似值是使用条件运算符:

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

这是不舒服的恕我直言。 我可以做得更好吗?

C#空合并运算符( ?? )的JavaScript等价物使用逻辑OR( || ):

 var whatIWant = someString || "Cookies!"; 

有一些情况(下面已经说明)行为不符合C#的行为,但这是在JavaScript中分配默认值/替代值的一般方法。


澄清

无论第一个操作数的types是什么,如果将其转换为布尔值将导致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" 
 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 

这个解决scheme像SQL coalesce函数一样工作,它接受任意数量的参数,并且如果它们都没有值,则返回null。 它的行为像C#? 运算符的意思是“”,false和0被认为是非空的,因此算作实际值。 如果你来自.net背景,这将是最自然的感觉解决scheme。

如果|| 作为C#的替代品?? 在你的情况下是不够的,因为它吞下空的string和零,你可以随时编写自己的function:

  function $N(value, ifnull) { if (value === null || value === undefined) return ifnull; return value; } var whatIWant = $N(someString, 'Cookies!'); 

没有人在这里提到NaN的潜力,对我来说这也是一个无效价值。 所以,我想我会加两分钱。

对于给定的代码:

 var a, b = null, c = parseInt('Not a number'), d = 0, e = '', f = 1 ; 

如果你要使用|| 运算符,你会得到第一个非错误值:

 var result = a || b || c || d || e || f; // result === 1 

如果您使用典型的coalesce方法,则在此处发布 ,您将得到c ,其值为: NaN

 var result = coalesce(a,b,c,d,e,f); // result.toString() === 'NaN' 

这些都不适合我。 在我自己的小世界中,可能与你的世界不同,我认为undefined,null和NaN都是“null-ish”。 所以,我期望从coalesce方法返回d (零)。

如果任何人的大脑像我的一样工作,并且你想排除NaN ,那么这个方法将实现:

 function coalesce() { var i, undefined, arg; for( i=0; i < arguments.length; i++ ) { arg = arguments[i]; if( arg !== null && arg !== undefined && (typeof arg !== 'number' || arg.toString() !== 'NaN') ) { return arg; } } return null; } 

对于那些希望尽可能短的代码,并且不介意有点不清晰,你也可以按照@impinball的build议来使用它。 这利用了NaN永远不等于NaN的事实。 你可以在这里了解更多: 为什么NaN不等于NaN?

 function coalesce() { var i, arg; for( i=0; i < arguments.length; i++ ) { arg = arguments[i]; if( arg != null && arg === arg ) { //arg === arg is false for NaN return arg; } } return null; } 

注意null的JavaScript特定定义。 在javascript中有两个“没有价值”的定义。 1. Null:当一个variables为null时,表示它没有包含任何数据,但是这个variables已经在代码中定义了。 喜欢这个:

 var myEmptyValue = 1; myEmptyValue = null; if ( myEmptyValue === null ) { window.alert('it is null'); } // alerts 

在这种情况下,你的variables的types实际上是Object。 testing一下。

 window.alert(typeof myEmptyValue); // prints Object 
  1. 未定义:当一个variables在代码中没有被定义之前,并且如预期的那样,它不包含任何值。 喜欢这个:

     if ( myUndefinedValue === undefined ) { window.alert('it is undefined'); } // alerts 

如果这样的话,你的variables的types是'undefined'。

请注意,如果您使用types转换比较运算符(==),则JavaScript将对这两个空值均等起作用。 要区分它们,总是使用types严格的比较运算符(===)。

在阅读您的说明之后,@Ates Goral的答案提供了如何在JavaScript中使用C#执行相同的操作。

@Gumbo的答案提供了检查null的最佳方法; 不过,重要的是要注意JavaScript和===在JavaScript中的区别, 特别是当涉及检查undefined和/或null

这里有两篇关于这个区别的非常好的文章。 基本上,要明白,如果你使用==而不是=== ,那么JavaScript将尝试合并你正在比较的值,并返回这个合并之后的比较结果。

目前没有支持,但JS标准化进程正在进行: https : //github.com/tc39/proposal-optional-chaining