ECMAScript 规范中的 ExpressionNoIn 是什么意思?

What does `ExpressionNoIn` mean in the ECMAScript spec?

我正在深入研究 for 循环并在 http://www.ecma-international.org/ecma-262/5.1/#sec-12.6.3

的规范中遇到 ExpressionNoIn

这是什么意思?

ExpressionNoIn 是一个非终结符,所有表达式都可以从中导出,期望 in 操作(即 'prop' in obj)。

从底部(其中定义了 ExpressionNoIn)跟随 A3 到不包含(不同的)*NoIn 非终结符的第一个 *NoIn 非终结符不再有终端:

RelationalExpression :
    ShiftExpression
    RelationalExpression < ShiftExpression
    RelationalExpression > ShiftExpression
    RelationalExpression <= ShiftExpression
    RelationalExpression >= ShiftExpression
    RelationalExpression instanceof ShiftExpression
    RelationalExpression in ShiftExpression

RelationalExpressionNoIn :
    ShiftExpression
    RelationalExpressionNoIn < ShiftExpression
    RelationalExpressionNoIn > ShiftExpression
    RelationalExpressionNoIn <= ShiftExpression
    RelationalExpressionNoIn >= ShiftExpression
    RelationalExpressionNoIn instanceof ShiftExpression

我想这样更容易区分 for 循环和 for/in 循环。

section 11.14中有说明 "Comma Operator ( , )":

*NoIn 具有相同的结构,只是在第 11.8 节中排除了 in 关键字的使用 "Relational Operators":

规范说:

The "NoIn" variants are needed to avoid confusing the in operator in a relational expression with the in operator in a for statement.

因为in有两种用法:

for (var x in foo) { ... }

或:

if ('x' in foo) { ... }

"NoIn" 变体使得无法在 for 循环的第一个表达式中使用上面 in 的第二个版本。所以,下面的代码是无效的:

for (y = 'x' in foo; y; y = false) { ... }