在ECMA-262的sec 11.1.5中,我们有对象声明符号:
ObjectLiteral :
{ }
{ PropertyNameAndValueList }
{ PropertyNameAndValueList , }
PropertyNameAndValueList :
PropertyAssignment
PropertyNameAndValueList , PropertyAssignment
PropertyAssignment :
PropertyName : AssignmentExpression
get PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList ) { FunctionBody }
PropertyName :
IdentifierName
StringLiteral
NumericLiteral
PropertySetParameterList :
Identifier
好吧,请考虑以下ObjectLiteral
:{prop: 'prop'}
。因此,我们有{PropertyName: AssignmentExpression}
形式的字面意思。现在显然'prop'
是AssignmentExpression
。通过sec 11.13的定位,AssignmentExpression
是
AssignmentExpression :
ConditionalExpression
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
问题:
为什么'prop'
是AssignmentExpression
?没有AssignmentOperator
或=
,'prop'
没有ConditionalExpression
。
答案 0 :(得分:2)
AssignmentExpression 几乎表示语言中的任何表达式,而不是使用逗号运算符/标点符号的表达式。
基本上,生产规则具有运算符优先级和关联性。
AssignmentExpression
=> ConditionalExpression (11.13)
=> LogicalORExpression (11.12)
=> LogicalANDExpression (11.11)
=> BitwiseORExpression (11.10)
=> BitwiseXORExpression (11.10)
=> BitwiseANDExpression (11.10)
=> EqualityExpression (11.10)
=> RelationalExpression (11.9)
=> ShiftExpression (11.8)
=> AdditiveExpression (11.7)
=> MultiplicativeExpression (11.6)
=> UnaryExpression (11.5)
=> PostfixExpression (11.4)
=> LeftHandSideExpression (11.3)
=> NewExpression (11.2)
=> MemberExpression (11.2)
=> PrimaryExpression (11.2)
=> Literal (11.1)
=> StringLiteral (7.8)
=> ' SingleStringChars(opt) ' (7.8.4)
请注意我们越深入,优先级越高。例如,您可能已经知道*
的优先级高于+
或-
。在语法中指定优先级的一种非常常见的方法是为每个运算符层设置生成规则,并且具体地说(例如)“加法表达式”是由+
分隔的一个或多个“乘法表达式”或-
。根据这样的规则,解析器必须先处理乘法子表达式,然后才能尝试生成加法或减法表达式。
答案 1 :(得分:1)
'prop'
当然不是ConditionalExpression
。
是的。条件这个术语并不意味着它必然包含一个条件,但它是在被允许包含条件的表达式的语法层面 - 来实现operator associativity排序。
这是一个分解:
ConditionalExpression: LogicalORExpression (§11.12)
LogicalORExpression: LogicalANDExpression (§11.11)
LogicalANDExpression: BitwiseORExpression (§11.11)
BitwiseORExpression: BitwiseXORExpression (§11.10)
BitwiseXORExpression: BitwiseANDExpression (§11.10)
BitwiseANDExpression: EqualityExpression (§11.10)
EqualityExpression: RelationalExpression (§11.9)
RelationalExpression: ShiftExpression (§11.8)
ShiftExpression: AdditiveExpression (§11.7)
AdditiveExpression: MultiplicativeExpression (§11.6)
MultiplicativeExpression: UnaryExpression (§11.5)
UnaryExpression: PostfixExpression (§11.4)
PostfixExpression: LeftHandSideExpression (§11.3)
LeftHandSideExpression: NewExpression (§11.2)
NewExpression: MemberExpression (§11.2)
MemberExpression: PrimaryExpression (§11.2)
PrimaryExpression: Literal (§11.1)
Literal: StringLiteral (§7.8)
答案 2 :(得分:0)
这是AssignmentExpression
,因为你可以写:
{ prop: a = 'prop' }
或:
{ prop: a == 3 ? 'prop1' : 'prop2' }