为什么三元运算符中的这个逗号在JavaScript中引发语法错误?

李国安:

当尝试在条件(三元)运算符中使用逗号运算符进行记录时,我注意到了一些奇怪的事情。这是一个人为的示例:

const a = 2;
const b = 1;
a > b ? console.log(a), a : b; //I expect this to log and evaluate to a

但是相反,我遇到了这个:

Uncaught SyntaxError: Unexpected token ,

根据MDN文档,条件运算符接受两个表达式作为三元运算符的'if'和'else'情况,而逗号运算符理论上是一个表达式

逗号运算符评估每个操作数(从左到右)并返回最后一个操作数的值。

那么为什么会出现语法错误?逗号运算符是一个表达式,应允许其在条件运算符中使用。尽管在逗号的操作数两边加上括号可以很好地工作:

a > b ? (console.log(a), a) : b; //Logs and gives a

为什么工作正常?圆括号(或分组操作)允许解释者知道它在处理一个表达式,但console.log(a), a已经无需括号的表达,所以为什么我得到一个语法错误,没有他们?

李国安:

这是该语言的有意组成部分,并在ECMAScript语言规范中进行了概述逗号运算符的语法在第12.16节中定义,该规定以下内容:

12.16逗号运算符(,)

句法

表达式:
  AssignmentExpression 
  表达式,AssignmentExpression

在此,规范概述了如何使用逗号运算符。An Expression是任意值AssignmentExpression或其本身后跟一个逗号(运算符)和另一个AssignmentExpression需要注意的重要一点是,一个AssignmentExpression是一个Expression,但一个Expression没有AssignmentExpression

对于实际的条件运算符,该运算符和条件表达式的语法在第12.14节中进行了具体说明

12.14条件运算符(?:)

句法

条件表达式  
  LogicalORExpression 逻辑ORExpression?AssignmentExpression:AssignmentExpression

根据规范,条件表达式只能包含AssignmentExpressions- 不能仅包含Expressions。因此,条件运算符不能在其操作数之一中包含逗号运算符。这似乎是一种怪异的语言怪癖,但是有一个特定的原因考虑到非常具体的语法,并且按照规范:

注意ConditionalExpressionECMAScript 中的a语法与C和Java中的略有不同,后者分别允许第二个子表达式为1,但将第三个子表达式限制为a 在ECMAScript的这种差别的动机是允许赋值表达式到由条件的任一臂上的约束消除逗号表达式为中心表达的混淆和相当无用的情况。ExpressionConditionalExpression

由于Java和C的限制性语法,它们不允许这样的事情(Java):

int a = 2;
int b = 1;
System.out.println(a > b ? b = a : a = b); //Can't use assignment in 'else' part
//                                 ^^^^^

ECMAScript作者决定允许在三元运算符的两个分支中进行赋值,因此出现了这种定义AssignmentExpression因此,该定义也不允许逗号运算符实际出现在条件运算符的“ if”部分,但是由于其稀缺性和无用性,这不是问题。他们基本上用一块石头杀死了两只鸟。允许更宽松的语法,并摆脱了不良做法的无用语法。

添加分组运算符使之能够工作的原因( Expression )是,根据定义,分组运算符的生产AssignmentExpression允许其位于三元运算符中,有关更多详细信息,请参见str的答案


1这是指JavaExpression而不是ECMAScript ExpressionJava的确实具备逗号操作符所以它Expression不包括它。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

erb中的语法错误三元运算符

类中的三元运算符语法错误

PHP Laravel 中的三元运算符语法错误

Python:三元运算符语法错误

PHP三元运算符语法错误

为什么“或”运算符不能“ ||” 在此JavaScript代码中替换三元运算符“?:”?

为什么三元运算符出现错误?

Pug语法中的三元运算符

IE11:javascript“排序”中的三元引发语法错误

`pass` 使用三元运算符给出语法错误

三元运算符,使用赋值时语法错误

在PHP语法错误的MYSQL查询中使用三元运算符

为什么三元运算符在Java中的方法参数中不起作用

为什么使用三元运算符在宏中定义1和0?

为什么我们不能在三元运算符中返回?

为什么Powershell中的三元运算符不分配我的值?

为什么不执行三元运算符中的多个语句

为什么三元(?:)运算符中的std :: istringstream解析为与std :: ifstream不同?

为什么JSX中的三元运算符不起作用

为什么我的三元运算符不能在 Jsx 中工作?

Javascript三元运算符:“(myvar)”中的条件是什么?什么时候是数字?

为什么在三元运算符内部返回会引发SyntaxError?

我的应用中的javascript三元运算符有什么问题?

javascript中问号的含义是什么 - 但它不是三元运算符?

三元运算符中的“ + =”运算符是什么意思?

为什么此三元运算符语法无效?

三元运算符中的三元运算符是否可能

锚标记 href 中带有三元运算符的条件 url 会引发解析错误 Angular

三元运算符中的多个运算