理解JavaScript中的对象初始值设定项符号
在ECMA-262中,我们有对象声明符号:理解JavaScript中的对象初始值设定项符号,javascript,Javascript,在ECMA-262中,我们有对象声明符号: ObjectLiteral : { } { PropertyNameAndValueList } { PropertyNameAndValueList , } PropertyNameAndValueList : PropertyAssignment PropertyNameAndValueList , PropertyAssignment PropertyAssignment : PropertyNam
ObjectLiteral :
{ }
{ PropertyNameAndValueList }
{ PropertyNameAndValueList , }
PropertyNameAndValueList :
PropertyAssignment
PropertyNameAndValueList , PropertyAssignment
PropertyAssignment :
PropertyName : AssignmentExpression
get PropertyName ( ) { FunctionBody }
set PropertyName ( PropertySetParameterList ) { FunctionBody }
PropertyName :
IdentifierName
StringLiteral
NumericLiteral
PropertySetParameterList :
Identifier
< P> >,考虑下面的<代码> ObjutTrimeAuth/<代码>:<代码> {PROP:PROP}}<代码>。因此,我们有形式为{PropertyName:AssignmentExpression}
的文本。现在很明显,'prop'
是AssignmentExpression
。根据AssignmentExpression
AssignmentExpression :
ConditionalExpression
LeftHandSideExpression = AssignmentExpression
LeftHandSideExpression AssignmentOperator AssignmentExpression
问题:
为什么
'prop'
是AssignmentExpression
?没有AssignmentOperator
或=
,'prop'
肯定没有条件表达式
。这是一个AssignmentExpression
,因为您可以编写:
{ prop: a = 'prop' }
或:
'prop'
不是conditionalPression
当然
是的。条件句并不意味着它一定包含条件句,而是在语法层面上允许包含条件句,以实现顺序
下面是一个细分:
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)
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)
注意我们走得越深,优先级就越高。例如,您可能已经知道
*
的优先级高于+
或-
。在语法中指定优先级的一种非常常见的方法是为每一层运算符指定一个产生式规则,并明确指出(例如)“加法表达式”是一个或多个“乘法表达式”,由+
或-
分隔。根据这样的规则,解析器必须先处理乘法子表达式,然后才能尝试生成加法或减法表达式。当然{prop:'prop'}
是属性名称和值列表
?@lonesomeday我很困惑,你能解释一下在我的ObjectLiteral
中如何计算'prop'
?在11.1.5中说,值不需要是literal;每次计算对象初始值设定项时,都会计算它们。但正如我在你的帖子中所理解的那样,AssignmentExpression
可以是Literal
对。可以,但不一定非得。很棒的解释!我很理解。非常感谢!:)
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)