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

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

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

我可以为Javascript找到的最佳近似是使用条件运算符:

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

这有点讨厌IMHO。我能做得更好吗?


当前回答

链接多个值/多个值

启用“短路”:如果第一个值之一有效,则不进行任何进一步评估这意味着顺序很重要,最左边的值优先

const value = first ?? second ?? third ?? "default";

其他回答

使用Babel的用户需要升级到最新版本才能使用零合并(??):

Babel 7.8.0默认支持新的ECMAScript 2020功能:不需要启用单独的插件来进行无效合并(??),可选的链接(?.)和动态导入()不再带有预设env

从…起https://babeljs.io/blog/2020/01/11/7.8.0

如果||作为C#??的替代品??在您的情况下还不够好,因为它包含空字符串和零,所以您可以始终编写自己的函数:

 function $N(value, ifnull) {
    if (value === null || value === undefined)
      return ifnull;
    return value;
 }

 var whatIWant = $N(someString, 'Cookies!');

这里有两项:

逻辑或

const foo=“”|“默认字符串”;

console.log(foo);//输出为“默认字符串”

空合并运算符

常量foo=''??'默认字符串';

console.log(foo);//输出为空字符串,即“”

零合并运算符(??)是一种逻辑运算符,当左侧操作数为空或未定义时,它返回右侧操作数,否则返回左侧操作数。

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Nullish_coalescing_operator

请注意null的JavaScript特定定义。javascript中“无值”有两个定义。1.空:当变量为空时,表示该变量中不包含数据,但该变量已在代码中定义。这样地:

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

在这种情况下,变量的类型实际上是Object。测试它。

window.alert(typeof myEmptyValue); // prints Object

未定义:当一个变量之前没有在代码中定义,并且正如预期的那样,它不包含任何值。这样地:如果(myUndefinedValue==undefined){window.alert('it is undefined');}//警报

如果是这种情况,则变量的类型为“undefined”。

注意,如果您使用类型转换比较运算符(==),JavaScript将对这两个空值起同等作用。要区分它们,请始终使用类型严格比较运算符(==)。

?? vs | | vs&&

其他答案中没有一个能比较这三个答案。由于贾斯汀·约翰逊(Justin Johnson)的评论获得了如此多的选票,而且javascript中的双问号vs&&被标记为这一条的重复,因此在答案中包含&&是有意义的。

首先,受贾斯汀·约翰逊评论的启发:

||返回第一个“truey”值,否则返回最后一个值。&&返回第一个“false”值,否则返回最后一个值。?? 返回第一个非空的、未定义的值,否则返回最后一个值,无论它是什么。

然后,用实时代码演示:

设F1,F2=空,F3=0,F4=“”,F5=parseInt('不是数字(NaN)'),T1=3,T2=8控制台日志(F1||F2||F3||F4||F5||T1||T2)//3(T1)console.log(F1||F2||F3||F4||F5)//NaN(F5)console.log(T1&&T2&&F1&&F2&&F3&&F4&&F5)//未定义(F1)console.log(T1和T2)//8(T2)控制台日志(F1??F2??F3??F4??F5??T1)//0(F3)console.log(F1??F2)//空(F2)