了解JavaScript中的对象初始值表示法

时间:2013-12-19 21:24:37

标签: javascript

在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

3 个答案:

答案 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' }