从 Javascript 中的和或中回退到三元运算符时出现意外结果

Unexpected result when falling back to a ternary operator from and OR in Javascript

你们当中有谁能告诉我原因吗

"yes" || true === true ? "no" : null

returns "no"

但是

"yes" || (true === true ? "no" : null)

returns "yes"?

难倒我了!

OR 运算符 (||) 是一个短路运算符,因此一旦它找到一个真值,它就会 return 得到它。在第二种情况下,您有两个值 "yes",所有内容都在括号内。由于 "yes",一个非空字符串,是真实的,它会短路到 return that.

在你的第一种情况下,? 之前的所有内容都隐含地组合在一起,所以它与说 ("yes" || true === true) ? "no" : null 相同。由于 ("yes" || true === true) 的计算结果为真,我们将得到三元的肯定选项,"no"

Javascript 如果确定知道值是什么,将停止评估条件。

JavaScript 中的假值为 0、0n、null、undefined、false、NaN 和空字符串 ""

由于 "yes" 是其中的 none,因此它的计算结果始终为真。

在你的第一个例子中:

"yes" || true === true 

条件是否正在评估并且为真,导致三元运算采用真实路径并评估为 "no"。

在你的第二个例子中

true === true

是有条件的,但也是真的,导致三元运算再次采用真实路径并评估为 "no"

然而,当首先与 "yes" 进行或运算时,javascript 停止计算并简单地 returns "yes"

首先,|| (或)return第一个真值。

所以在这里:

"yes" || true === true ? "no" : null

它会 return "no" 因为 "yes" == true 但不是 === 所以它会查看第二个值是真的,true === true,没错。

第二个,会先执行()里面的代码 所以,(true === true ? "no" : null) 将 return "no" 然后 "yes" || "no" 将 return "yes" 因为它第一个真值

OR 仅用于计算布尔参数,从左到右,直到找到第一个真值。如果所有参数都不是布尔值但可以被评估或 returns 第一个真值,在你的情况下 '(true === true? "no": null)' 不能被评估,那么它 returns 'yes' 因为是第一个可以计算的值。

let value = false || '0' || 'true';

console.log(value); //returns '0'

PD:抱歉我的英语不好