【发布时间】:2015-03-27 20:39:04
【问题描述】:
我正在深入研究 for 循环,并在 http://www.ecma-international.org/ecma-262/5.1/#sec-12.6.3 的规范中遇到了 ExpressionNoIn
什么意思?
【问题讨论】:
我正在深入研究 for 循环,并在 http://www.ecma-international.org/ecma-262/5.1/#sec-12.6.3 的规范中遇到了 ExpressionNoIn
什么意思?
【问题讨论】:
在section 11.14“逗号运算符(, )”中有解释:
*NoIn 具有相同的结构,除了在第 11.8 节“关系运算符”中排除了 in 关键字的使用:
规范说:
需要“NoIn”变体以避免将关系表达式中的
in运算符与for语句中的in运算符混淆。
in 有两种用法:
for (var x in foo) { ... }
或者:
if ('x' in foo) { ... }
“NoIn”变体使得无法在for 循环的第一个表达式中使用上述in 的第二个版本。所以,下面的代码是无效的:
for (y = 'x' in foo; y; y = false) { ... }
【讨论】:
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 循环。
【讨论】: