ECMAScript仕様理解パート2の「追加内容」
なぜ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