【问题标题】:Unexpected result when falling back to a ternary operator from and OR in Javascript在 Javascript 中从 and OR 回退到三元运算符时出现意外结果
【发布时间】:2020-06-05 08:20:05
【问题描述】:
谁能告诉我为什么?
"yes" || true === true ? "no" : null
返回"no"
但是
"yes" || (true === true ? "no" : null)
返回"yes"?
把我难住了!
【问题讨论】:
标签:
javascript
conditional-statements
conditional-operator
【解决方案1】:
OR 仅用于评估布尔参数,从左到右,直到找到第一个真值。如果所有参数都不是布尔值但可以被评估或返回第一个真实值,在你的情况下 '(true === true? "no": null)' 不能被评估,那么它返回 'yes' 因为是可以评估的第一个值。
let value = false || '0' || 'true';
console.log(value); //returns '0'
PD:对不起我的英语不好
【解决方案2】:
首先,|| (or) 返回第一个真值。
所以这里:
"yes" || true === true ? "no" : null
它将返回“否”,因为 "yes" == true 但不是 ===
所以它会看第二个值是真的,true === true,没错。
第二个,会先执行()里面的代码
所以,(true === true ? "no" : null) 将返回“否”
然后"yes" || "no" 将返回"yes" 因为它的第一个真实值
【解决方案3】:
如果 JavaScript 明确知道值是什么,它将停止评估条件。
JavaScript 中的 falsy 值为 0、0n、null、undefined、false、NaN 和空字符串“”
因为“是”不是这些,所以它总是评估为真。
在你的第一个例子中:
"yes" || true === true
条件是求值且为真,导致三元运算走真路径,求值为“否”。
在你的第二个例子中
true === true
是有条件的,但也是真的,导致三元运算再次走真路径并评估为“否”
但是,当首先与“是”进行或运算时,javascript 会停止评估并简单地返回“是”
【解决方案4】:
OR 运算符 (||) 是一个短路运算符,因此一旦找到真值,它就会返回它。在第二种情况下,您有两个值,"yes",以及括号内的所有内容。由于"yes",一个非空字符串,是真的,它会短路返回。
在您的第一种情况下,? 之前的所有内容都隐式组合在一起,因此与 ("yes" || true === true) ? "no" : null 相同。由于("yes" || true === true) 的计算结果为真,我们将得到三元的肯定选项"no"。