【问题标题】:Short circuiting in place of ternary operator短路代替三元运算符
【发布时间】:2023-04-10 15:22:01
【问题描述】:

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

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语句

标签: javascript short-circuiting


【解决方案1】:

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

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

此答案采用术语truthyfalsy,尤其是对于部分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

    我希望现在很清楚

    【讨论】:

    • 是的,现在很清楚,我只是错误地处理了运算符优先级,因此我对此表示怀疑。谢谢你的澄清
    • 如果对优先级有疑问,请使用括号:)
    猜你喜欢
    • 2011-12-15
    • 2020-10-06
    • 2012-06-23
    • 2014-12-03
    • 2016-05-11
    • 1970-01-01
    • 2011-07-08
    • 2016-01-29
    • 1970-01-01
    相关资源
    最近更新 更多