【问题标题】:What does `ExpressionNoIn` mean in the ECMAScript spec?ECMAScript 规范中的 `ExpressionNoIn` 是什么意思?
【发布时间】:2015-03-27 20:39:04
【问题描述】:

我正在深入研究 for 循环,并在 http://www.ecma-international.org/ecma-262/5.1/#sec-12.6.3 的规范中遇到了 ExpressionNoIn

什么意思?

【问题讨论】:

    标签: javascript ecmascript-5


    【解决方案1】:

    在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) { ... }
    

    【讨论】:

    • 好的,我已经读了 4 遍了,它开始变得有意义了。这是密集而深刻的东西。
    • 点击了。谢谢你:)
    【解决方案2】:

    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 循环。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-08
      • 2016-07-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多