为什么 JavaScript UpdateExpression 语法如此定义?
Why is JavaScript UpdateExpression syntax so defined?
根据 Ecma-262,前缀递增和递减运算符定义为:
UpdateExpression :
LeftHandSideExpression ++
LeftHandSideExpression ‐‐
++ UnaryExpression
‐‐ UnaryExpression
令人惊讶的是,后缀运算符和前缀运算符都是在同一规则中定义的,而且 ++ UnaryExpression
通常一元表达式肯定不是更新运算符的有效参数。
在 UnaryExpression
本身中定义前缀递增和递减运算符以及其他前缀运算符和其他 C 语法语言这样做似乎更清晰、更合乎逻辑,例如C 标准第 6.5.3 节定义 unary-expression
以包括前缀更新运算符和其他运算符。
为什么 JavaScript 以这种方式定义这些运算符?
Why does JavaScript define these operators the way it does?
它主要是历史原因,就像规范中的许多其他奇怪之处一样。
It would seem cleaner and more logical to define the prefix increment and decrement operators in UnaryExpression
itself, along with the other prefix operators, and other C syntax languages do this
事实上,ES5.1 and ES6 多年来就是这样定义的。它很简单,并且每个优先级都有一个句法产生式(PostfixExpression
是下一个更严格的语法),并且可能是在构思 JS 时直接从 C 或 Java 语法继承的。
Surely a unary expression in general is not actually a valid argument for the update operators
在C中,-- -- x
实际上是有效的,所以这就是为什么前缀递增和递减运算符表达式包含另一个UnaryExpression
。当然,它会在尝试计算表达式时抛出异常,但在 ES5 中解析它可以正常工作。
ES6 然后添加了早期错误 的概念,并且现在 required a valid assignment target expression 在解析时增加和减少操作。不过,这并没有编码在语法产品中。
It is surprising that the postfix and prefix operators are defined in the same rule
此定义是 new in ES7. It changed with this commit,它引入了 求幂运算符 ,其中 PostfixExpression
已重命名为 UpdateExpression
并且前缀运算符已移动入规则。像这样的一些改变是必要的,因为 **
运算符允许更新表达式,但不允许 UnaryExpression
作为它的第一个参数(因为一元减号,如 -x ** 3
被认为太模棱两可)。
根据 Ecma-262,前缀递增和递减运算符定义为:
UpdateExpression :
LeftHandSideExpression ++
LeftHandSideExpression ‐‐
++ UnaryExpression
‐‐ UnaryExpression
令人惊讶的是,后缀运算符和前缀运算符都是在同一规则中定义的,而且 ++ UnaryExpression
通常一元表达式肯定不是更新运算符的有效参数。
在 UnaryExpression
本身中定义前缀递增和递减运算符以及其他前缀运算符和其他 C 语法语言这样做似乎更清晰、更合乎逻辑,例如C 标准第 6.5.3 节定义 unary-expression
以包括前缀更新运算符和其他运算符。
为什么 JavaScript 以这种方式定义这些运算符?
Why does JavaScript define these operators the way it does?
它主要是历史原因,就像规范中的许多其他奇怪之处一样。
It would seem cleaner and more logical to define the prefix increment and decrement operators in
UnaryExpression
itself, along with the other prefix operators, and other C syntax languages do this
事实上,ES5.1 and ES6 多年来就是这样定义的。它很简单,并且每个优先级都有一个句法产生式(PostfixExpression
是下一个更严格的语法),并且可能是在构思 JS 时直接从 C 或 Java 语法继承的。
Surely a unary expression in general is not actually a valid argument for the update operators
在C中,-- -- x
实际上是有效的,所以这就是为什么前缀递增和递减运算符表达式包含另一个UnaryExpression
。当然,它会在尝试计算表达式时抛出异常,但在 ES5 中解析它可以正常工作。
ES6 然后添加了早期错误 的概念,并且现在 required a valid assignment target expression 在解析时增加和减少操作。不过,这并没有编码在语法产品中。
It is surprising that the postfix and prefix operators are defined in the same rule
此定义是 new in ES7. It changed with this commit,它引入了 求幂运算符 ,其中 PostfixExpression
已重命名为 UpdateExpression
并且前缀运算符已移动入规则。像这样的一些改变是必要的,因为 **
运算符允许更新表达式,但不允许 UnaryExpression
作为它的第一个参数(因为一元减号,如 -x ** 3
被认为太模棱两可)。