【问题标题】:Javascript OR Expression: return Operand that is *not* NaNJavascript OR 表达式:返回 *not* NaN 的操作数
【发布时间】:2020-01-30 08:04:03
【问题描述】:

我有一个 OR 表达式,它应该返回除 NaN 之外的任何操作数:

(1 || NaN) // evaluates to 1 
(NaN || 1) // evaluates to 1

但是当另一个操作数也是 0nullundefinedfalse 之类的假值时,Javascript 总是返回最右边的操作数:

(0 || NaN) // evaluates to NaN
(NaN || 0) // evaluates to 0
// same for combinations of 0, null, undefined and false

有没有办法将所需的行为“返回 not NaN 的操作数”变成一个漂亮而简短的表达式,还是我必须依赖 if/else 构造?

【问题讨论】:

  • 为什么不(总是)将NaN 作为第一个操作数?
  • @Nina Scholz:例子简化了,我不知道NaN是哪个操作数,每个操作数都是另一个函数/表达式的结果
  • 你可以使用ternary
  • @all:我认为所有答案都很棒,我需要一些时间才能选择一个接受,谢谢!

标签: javascript operator-precedence


【解决方案1】:

您可以在表达式末尾添加一个默认的falsy 值,例如

result = yourValue0 || yourValue1 || 0;

在这种情况下,您会得到 truthyyourValueXlast falsy 值。

【讨论】:

    【解决方案2】:

    使用 if-else-expression,也称为条件运算符:

    !isNaN(a) ? a : b
    

    【讨论】:

      【解决方案3】:

      试试这个:

      var notNaN = [value1, value2, value3].find(item => !Number.isNaN(item))
      

      【讨论】:

      • 如果你正在做布尔检查,不妨使用Array#some
      【解决方案4】:

      这种运算符使用惰性机制进行计算,这个概念在 javascript 中称为短循环。基本上,只要 JS 感觉不需要更多的计算来评估这个表达式,JS 就会返回值。因此,如果它是一个 && 运算符,它将在找到第一个 non-truthy(0, "", null, undefined, NaN) 后立即返回,对于 && 运算符,如果任何操作数是 non-truthy,则没有点检查休息作为表达式的操作数已经不真实,因此它返回该值并退出,现在如果所有操作数都是真实的,它会检查直到最后一个并返回最后一个值。对于 ||反之,只要找到第一个真值,它就会返回,否则会一直检查直到最后一个并返回它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-07
        • 1970-01-01
        • 1970-01-01
        • 2015-07-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多