短路代替三元运算符

Short circuiting in place of ternary operator

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

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

我的理解是 && 运算符将左侧视为表达式的第 1 部分,将整个右侧视为第 2 部分。所以我不太明白为什么最后这个returns{game.team2}....

你能帮我澄清一下吗?

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

game.odds.team1 < game.odds.team2 ? `${game.team2} is more likely to win` : `${game.team1} is more likely to win`

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

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

此答案采用术语 truthy and falsy,尤其是 cd 部分。

如果第一个条件 a < btrue,只要 c 为真,它就需要 c。如果没有,需要 d.

如果第一个条件是false,需要d,因为短路&&

为了更好的理解,这里说一个table的道理。 (- 表示值无关紧要):

a < b c d result
true truthy - c
true falsy d d
false - d d

My understanding was that && operator treats left-side as 1 part of expression and whole right side as a 2nd part

不,不是。 &&||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 && t || e。你能算出 t 可能是哪些值吗?

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

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

我 - 关键点:

1- 逻辑与运算符 && return 是第一个假值,如果所有操作数都已求值,它 return 是最后一个。

2- 逻辑或运算符 || return 是第一个真值,如果所有操作数都已求值,它 return 是最后一个。

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

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

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

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 < game.odds.team2false 并且 $team1 is more likely to win 是真实的,因为它是一个字符串,然后 && 将 return 第一个虚假值。

2- game.odds.team1 < game.odds.team2 是 returned(仍然是错误的)。现在用 team2 is more likely to win 进行评估,这是一个真实的字符串。

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

我希望现在已经清楚了