代码之家  ›  专栏  ›  技术社区  ›  maiermic

ECMAScript与C/Java条件表达式的语法差异

  •  3
  • maiermic  · 技术社区  · 6 年前

    引用自 ECMAScript Language Specification

    ECMAScript中ConditionalExpression的语法与C和Java中的略有不同,C和Java都允许第二个子表达式为表达式,但限制第三个表达式为ConditionalExpression。ECMAScript中这种差异的动机是允许赋值表达式由条件的任意一个分支来管理,并消除了逗号表达式作为中心表达式这一令人困惑且毫无用处的情况。

    有人能用例子更详细地解释一下这种差异吗? 什么是 useless case of a comma expression as the centre expression ?为什么C/Java中的条件表达式 allow an assignment expression to be governed by either arm of a conditional ?

    1 回复  |  直到 6 年前
        1
  •  2
  •   T.J. Crowder    6 年前

    在JavaScript中,可以执行以下操作:

    foo(condition ? a = 1 : b = 2);
    

    (您是否 应该 是另一回事,但你 可以 .)

    。。。结果将是对条件进行评估 a 已分配 1 b 已分配 2 ,然后 foo 使用以下任一项调用 1. 2.

    在Java中无法做到这一点(我无法与C对话,已经25年了),因为它不允许在第三个操作数中放置赋值表达式。奇怪的是,它确实允许您在第二个操作数中放置赋值表达式,因此您可以执行以下操作:

    foo(condition ? a = 1 : 2);
    

    。。。甚至在Java中。

    返回JavaScript:如果不允许您这样做

    foo(条件?a=1:b=2);
    

    。。。出于与Java相同的原因,您可以通过以下方式解决此问题:

    foo(condition ? a = 1 : (b = 2, b));
    // ---------------------^-----^^^^
    

    。。。因为JavaScript具有 逗号运算符 它计算其操作数,然后将右侧操作数的结果作为其值。逗号表达式( b = 2, b )不是赋值表达式,因此它将绕过一个限制条件,不允许在条件运算符的第三个操作数中使用赋值表达式(即使其中一个表达式传入逗号表达式, b = 2 ,是赋值表达式)。

    因此,通过允许在第三个操作数中使用赋值表达式,JavaScript避免了在那里毫无意义地使用逗号表达式。