“理解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