短路代替三元运算符
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,尤其是 c
和 d
部分。
如果第一个条件 a < b
是 true
,只要 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.team2
是 false
并且 $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
.
我希望现在已经清楚了
尝试学习短路和做一些作业。有以下代码
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,尤其是 c
和 d
部分。
如果第一个条件 a < b
是 true
,只要 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.team2
是 false
并且 $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
.
我希望现在已经清楚了