跳到主要内容

“理解ECMAScript规范,第二部分”的额外内容

· 阅读需 3 分钟
[Marja Hölttä](https://twitter.com/marjakh),推测的规范观察者

为什么o2.foo是一个AssignmentExpression?

o2.foo看起来不像一个AssignmentExpression,因为没有赋值。为什么它是一个AssignmentExpression

规范实际上允许AssignmentExpression既可以作为参数,也可以作为赋值的右侧。例如:

function simple(a) {
console.log('参数是 ' + a);
}
simple(x = 1);
// → 输出“参数是 1”。
x;
// → 1

…以及…

x = y = 5;
x; // 5
y; // 5

o2.foo是一个AssignmentExpression,但它实际上没有进行赋值。这源于以下语法规则,每一个规则都处理到“最简单”的情况直到最后一个:

AssignmentExpression不需要包含赋值,它也可以只是一个ConditionalExpression

AssignmentExpression : ConditionalExpression

(还有其他规则,这里我们只展示相关的规则。)

ConditionalExpression不需要包含条件(a == b ? c : d),它也可以只是一个ShortcircuitExpression

ConditionalExpression : ShortCircuitExpression

等等:

ShortCircuitExpression : LogicalORExpression

LogicalORExpression : LogicalANDExpression

LogicalANDExpression : BitwiseORExpression

BitwiseORExpression : BitwiseXORExpression

BitwiseXORExpression : BitwiseANDExpression

BitwiseANDExpression : EqualityExpression

EqualityExpression : RelationalExpression

RelationalExpression : ShiftExpression

快要到终点了…

ShiftExpression : AdditiveExpression

AdditiveExpression : MultiplicativeExpression

MultiplicativeExpression : ExponentialExpression

ExponentialExpression : UnaryExpression

不要灰心!就剩几个规则了…

UnaryExpression : UpdateExpression

UpdateExpression : LeftHandSideExpression

然后我们进入LeftHandSideExpression的规则:

LeftHandSideExpression : NewExpression CallExpression OptionalExpression

目前还不清楚哪条规则适用于o2.foo。我们只需要知道(或者查证)NewExpression实际上不一定需要包含new关键字。

NewExpression : MemberExpression

MemberExpression听起来是我们在寻找的东西,所以现在我们取规则

MemberExpression : MemberExpression . IdentifierName

所以,如果o2是一个有效的MemberExpression,那么o2.foo就是一个MemberExpression。幸运的是,这更容易理解:

MemberExpression : PrimaryExpression

PrimaryExpression : IdentifierReference

IdentifierReference : Identifier

o2显然是一个Identifier,所以没问题。o2是一个MemberExpression,所以o2.foo也是一个MemberExpression。一个MemberExpression是一个有效的AssignmentExpression,所以o2.foo也是一个AssignmentExpression