ECMA-2015 语法语法中的 CoverInitializedName[yield] 是什么

jee*_*efo 5 javascript ecmascript-6

我正在编写自己的 ES6 解析器。但我不明白 ObjectLiteral 中的 CoverInitializedName 是什么。

ECMA-2015 ObjectLiteral 规范中关于此的部分中,我看到

PropertyDefinition[Yield] :
    IdentifierReference[?Yield]
    CoverInitializedName[?Yield] <-- this is what I dont understand
    PropertyName[?Yield] : AssignmentExpression[In, ?Yield]
    MethodDefinition[?Yield]
Run Code Online (Sandbox Code Playgroud)

然后我查找 CoverInitializedName 的定义。

CoverInitializedName[Yield] :
    IdentifierReference[?Yield] Initializer[In, ?Yield]

IdentifierReference[Yield] :
    Identifier
    [~Yield] yield

Initializer[In, Yield] :
    = AssignmentExpression[?In, ?Yield]
Run Code Online (Sandbox Code Playgroud)

初始值设定项以 = 符号开头。

这意味着我可以使用这样的赋值运算符来分配属性。

let o = { prop = value };
Run Code Online (Sandbox Code Playgroud)

如果我执行此代码,它将抛出 SyntaxError: Invalid shorthand property initializer

我感到困惑并查看了MDN 对象初始值设定项文档。 哪有这回事。那么这个 CoverInitializedName 是什么?

[编辑]

loganfsmyth的回答是

({ prop = value } = {}); // valid destructuring
Run Code Online (Sandbox Code Playgroud)

在此脚本中,左侧{ prop = value }不是ObjectLiteral. 这是 ObjectBindingPattern 分配默认值13.3.3 Destructuring Binding Patterns。我认为 ObjectLiteral 是 rValue 不是吗?所以我的问题仍然存在:ObjectLiteral 中的 CoverInitializedName 是什么?还是我误会了什么?

log*_*yth 7

你是对的,这let o = { prop = value };是一个语法错误。然而,要考虑的关键根据上下文,还有其他情况允许的。例如

({ prop = value }); // syntax error
({ prop = value } = {}); // valid destructuring
Run Code Online (Sandbox Code Playgroud)

由于在prop = value完成对象解析并到达 之前您无法知道是否允许=,因此CoverInitializedName需要规则来解析此代码。如果您进一步查看您链接的部分,您会看到:

注 3:在某些上下文中,ObjectLiteral 用作更受限制的二级语法的覆盖语法。CoverInitializedName 产生式是完全覆盖这些辅助语法所必需的。但是,在需要实际 ObjectLiteral 的正常上下文中,使用此产生式会导致早期的语法错误。

它试图仅回答您提出的问题。

在对象文字的情况下,如您发布的代码段和我发布的语法错误案例,适用的早期错误是12.2.6.1 静态语义:早期错误,其中指出

PropertyDefinition : CoverInitializedName

  Always throw a Syntax Error if code matches this production.
Run Code Online (Sandbox Code Playgroud)

({ prop = value} = {})将根据12.14.5 Destructuring Assignment 中定义的语法成功解析,该语法具有

AssignmentProperty[Yield] : 
  IdentifierReference[?Yield] Initializer[In,?Yield]opt
  PropertyName : AssignmentElement[?Yield]
Run Code Online (Sandbox Code Playgroud)

这确实允许prop = value.