“理解ECMAScript规范,第二部分”的额外内容
为什么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
:
(还有其他规则,这里我们只展示相关的规则。)
ConditionalExpression
不需要包含条件(a == b ? c : d
),它也可以只是一个ShortcircuitExpression
:
等等:
ShortCircuitExpression : LogicalORExpression
LogicalORExpression : LogicalANDExpression
LogicalANDExpression : BitwiseORExpression
BitwiseORExpression : BitwiseXORExpression
BitwiseXORExpression : BitwiseANDExpression
BitwiseANDExpression : EqualityExpression
快要到终点了…
ShiftExpression : AdditiveExpression
AdditiveExpression : MultiplicativeExpression
不要灰心!就剩几个规则了…
然后我们进入LeftHandSideExpression
的规则:
LeftHandSideExpression :
NewExpression
CallExpression
OptionalExpression
目前还不清楚哪条规则适用于o2.foo
。我们只需要知道(或者查证)NewExpression
实际上不一定需要包含new
关键字。
MemberExpression
听起来是我们在寻找的东西,所以现在我们取规则
所以,如果o2
是一个有效的MemberExpression
,那么o2.foo
就是一个MemberExpression
。幸运的是,这更容易理解:
MemberExpression : PrimaryExpression
o2
显然是一个Identifier
,所以没问题。o2
是一个MemberExpression
,所以o2.foo
也是一个MemberExpression
。一个MemberExpression
是一个有效的AssignmentExpression
,所以o2.foo
也是一个AssignmentExpression
。