我们在 JavaScript 中有更简单的三元运算符吗? [复制]

Posted

技术标签:

【中文标题】我们在 JavaScript 中有更简单的三元运算符吗? [复制]【英文标题】:Do we have a simpler ternary operator in JavaScript? [duplicate] 【发布时间】:2018-01-20 15:38:10 【问题描述】:

我刚刚在 php 中看到了这种语法:

// Fetches the value of $_GET['user'] and returns 'nobody'
// if it does not exist.
$username = $_GET['user'] ?? 'nobody';

为什么我们在 javascript 中没有相同的功能?

我已经厌倦了:

var name = obj['name'] ? obj['name'] : 'GOD';

【问题讨论】:

P.S 如果我们已经有了,请告诉我 var name = obj['name'] || 'GOD'; 您的意思是条件运算符。根据定义,三元运算符需要三个操作数——这就是三元这个词的含义。三元运算符不能比一个需要三个操作数的运算符更简单 - 因为一个需要两个操作数的运算符,例如 ??这里显示的是二元运算符,就像 PHP 中的算术运算符和 concat 运算符一样。 【参考方案1】:

Null coalescing operator 是最近添加到 PHP 中的。它是在 PHP 7(2015 年 12 月发布)中引入的,比 proposed for the first time 早了 10 多年。

在 Javascript 中,logical OR 操作符可用于此目的很长时间 (since Javascript was created?!)。

正如documentation 解释的那样:

逻辑或 (||)

expr1 || expr2

如果可以转换为true,则返回expr1;否则,返回expr2。 因此,当与布尔值一起使用时,如果任一操作数为 true|| 将返回 true;如果两者都是false,则返回false

而不是写

var name = obj['name'] ? obj['name'] : 'GOD';

你可以使用更短的:

var name = obj['name'] || 'GOD';

|| 运算符可以多次使用以创建更长的表达式,该表达式的计算结果为第一个非空操作数的值:

var name = obj['name'] || obj['desc'] || 'GOD';

【讨论】:

我很好奇:您是如何在问题结束 30 分钟后发布答案的? 我不知道。我使用移动应用程序回答。现在我记得,在我发布答案后,问题再次加载并且已经关闭。当时我认为它在我的答案发布和问题重新加载之间关闭,但现在我看到,确实,我的答案的第一个版本是在问题关闭后 30 分钟发布的。也许矩阵中有一个小故障。 :-)【参考方案2】:

在 javascript 中,您可以执行以下操作:

var name = obj['name'] || "GOD"

如果第一个值为 false(nullfalse0NaN""undefined),则将分配第二个值。

【讨论】:

以上是关于我们在 JavaScript 中有更简单的三元运算符吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 三元运算符和赋值

JavaScript三元表达式&分支流程控制 switch 语句

JavaScript三元表达式&分支流程控制 switch 语句

三元运算和lambda

JavaScript一元运算符二元运算符和三元运算符

带有对象的Javascript三元运算符