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 是什么?还是我误会了什么?
你是对的,这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.