短路代替三元运算符

Posted

技术标签:

【中文标题】短路代替三元运算符【英文标题】:Short circuiting in place of ternary operator 【发布时间】:2021-07-26 17:26:20 【问题描述】:

尝试学习短路并做一些作业。有以下代码

game.odds.team1 < game.odds.team2 && `$game.team1 is more likely to win` || `$game.team2 is more likely to win`

我的理解是 && 运算符将左侧视为表达式的一部分,将整个右侧视为第二部分。所以我不太明白为什么最后会返回game.team2....

你能帮我澄清一下吗?

附:更准确地说,上面的代码运行良好,并且完成了它必须做的事情,但我很难理解它是如何工作的以及为什么会这样工作。

【问题讨论】:

请注意,使用字符串模板意味着您使用的是真实值,因为无论您为其中的变量分配什么,它都是字符串 是的,我明白了。这就是我需要的。实际上,我被要求用与三元运算符无关的表达式替换 if/else 请添加问题,你有这个代码。 让我们用正常的语法写出来:if (game.odds.team1 &lt; game.odds.team2) "$game.team1" else "$game.team2" 。实现相同目的只是一种奇怪的语法。 那么你可以使用switch语句 【参考方案1】:

这段代码的问题是有三个部分可以改变结果。

a < b && c || d
^^^^^    ^    ^

此答案采用术语truthy 和falsy,尤其是对于部分cd

如果a &lt; b的第一个条件是true,则只要c为真,就需要c。如果没有,则需要d

如果第一个条件是false,则取d,因为短路了&amp;&amp;

为了更好地理解,这里有一张真相表。 (- 表示值无关紧要):

a &lt; b c d result
true truthy - c
true falsy d d
false - d d

【讨论】:

【参考方案2】:

我的理解是 && 运算符将左侧视为表达式的一部分,将整个右侧视为第二部分

不,它没有。 &amp;&amp;|| 有一个 higher precedence。它被解析为

((game.odds.team1 < game.odds.team2) && `$game.team1 is more likely to win`) || `$game.team2 is more likely to win`

但是,是的,虽然这是一个很好的练习,但您绝对应该为此使用 ?: 条件运算符 :-) 除了表现力之外,另一个原因是 c ? t : e 并不总是等于 c &amp;&amp; t || e。你能弄清楚t 的值可能是什么吗?

【讨论】:

如果 t 也是一个假值?虽然不确定 @vdmclcv 没错! 感谢您的额外挑战@Bergi)))【参考方案3】:

编辑:根据您的问题,之前的解决方案已被删除

由于您只需要了解逻辑运算符的短路评估是如何工作的,所以我将添加以下说明:

I - 关键点:

1- 逻辑与运算符&amp;&amp; 返回第一个假值,如果所有操作数都被求值,则返回最后一个。

2-逻辑或运算符||返回第一个真值,如果所有操作数都被求值,则返回最后一个。

3- AND &amp;&amp; 运算符的优先级高于 OR ||

4-检查JS运算符优先级的table list

在您的示例中,逻辑 OR 的两个操作数(参数)都是真值(字符串)。

II - 示例:

从您的代码开始,让我们考虑这个值对象:

const game = 
    odds: 
        team1: 10,
        team2: 3
    


const winner = game.odds.team1 < game.odds.team2 && `$team1 is more likely to win` || `team2 is more likely to win`
console.log(winner)

在这里,winner 将分配给最后一个操作数。但为什么?让我们分解逻辑(记住关键点):

1- game.odds.team1 &lt; game.odds.team2false$team1 is more likely to win 是真值,因为它是一个字符串,那么 &amp;&amp; 将返回第一个假值。

2- game.odds.team1 &lt; game.odds.team2 返回(仍然为假)。现在用team2 is more likely to win 进行评估,这是一个真实的字符串。

3- 逻辑或返回第一个真值,因此team2 is more likely to win 被分配给winner

我希望现在很清楚

【讨论】:

是的,现在很清楚,我只是错误地处理了运算符优先级,因此我对此表示怀疑。谢谢你的澄清 如果对优先级有疑问,请使用括号:)

以上是关于短路代替三元运算符的主要内容,如果未能解决你的问题,请参考以下文章

三元运算符可以等效于与逻辑运算符的短路吗?

使用三元运算符或仅短路评估之间的区别?

JS优化:善用二元运算符&& ||三元运算符?:代替传统的if

关系运算符逻辑 运算符与三元运算符

微信小程序开发之三元运算符代替wx.if/wx.else

三元运算符 与 return