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