代码之家  ›  专栏  ›  技术社区  ›  Tonis F. Piip

使用| |进行赋值的奇怪之处,其中条件(三元)运算符是第二个选项

  •  0
  • Tonis F. Piip  · 技术社区  · 7 年前

    在我使用的代码中发现了一个bug foo = bar || baz 如果bar未定义,则要将其赋值给baz,但是当第二个参数使用三元表达式时,JS将为三元表达式赋值,而不管第一个值是什么。

    打开控制台并进行测试。似乎JS甚至没有计算条件表达式,如图所示,这里没有定义b,但它仍然返回它的真实值。

    >>> a = 1 || 2
    1
    >>> a = 0 || 2
    2
    >>> a = 1 || b
    1
    >>> a = 1 || b ? 3 : 4
    3
    >>> b
    ReferenceError: b is not defined[Learn More]
    >>> a = 1 || ( b ? 3 : 4 )
    1
    

    通过将三元表达式包装在()中,我可以得到正确的结果,但是这里发生了什么?为什么在上面的测试用例中返回3?

    1 回复  |  直到 7 年前
        1
  •  1
  •   CertainPerformance    7 年前

    || 懒惰的 || 左手边的一条线被确定为真实的。如果你做了 b || 1 1 || b ,它会尝试评估 b 首先,将抛出一个错误:

    const a = b || 1 ? 3 : 4

    整个左边 ? 被解释为条件。(在机器左侧执行的其他操作) 也将在整个 ? 条件运算符具有以下条件之一: lowest

    对于

    1 || b ? 3 : 4
    

    具有最高优先级的运算符为 ,五点。这两个表达式是 ||

    1 || b
    

    评估为 1 不假思索 .

    1 ? 3 : 4
    

    然后计算条件运算符(优先级4):

    true ? 3 : 4
    

    评估为

    3
    

    在条件的周围加括号时:

    1 || ( b ? 3 : 4 )
    

    括号中有 最高运算符优先级

    1 || <something>
    

    评估为

    1
    

    因为1是真实的。