【问题标题】: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"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-07-29
          • 2022-01-11
          • 2012-04-03
          • 2016-06-26
          • 1970-01-01
          • 2019-03-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多