ECMAScript中for-in与for-of循环的let预查规则为何存在差异?
ECMAScript中for-in与for-of循环的let预查规则为何存在差异?
咱们先看看ECMAScript规范里,ForInOfStatement生产规则中容易让人困惑的部分是怎么定义的:
for ( [lookahead ≠ let [] LeftHandSideExpression in Expression ) Statement for ( [lookahead ∉ { let, async of }] LeftHandSideExpression of AssignmentExpression )
先说明:不用纠结async of的差异,这部分已经有详细文档记录了。
现在的核心问题是:为什么for-in和for-of在let相关的否定预查上会有差异?
先看for-in的情况:它用let [作为否定预查,我猜是为了避免下面这种语法被上面的规则错误覆盖:
for (let[a] in [1]) ;
如果这条语法被上面的for-in规则处理,就会被解析成“把[1]的键赋值给(let)[a]”,这显然不是我们想要的。实际上,这条语法应该被另一条规则处理——它属于带数组解构模式的let声明,这才合理。
而下面这种写法是被for-in的规则合法覆盖的:
for (let.a in [1]) ;
意思就是把[1]的键赋值给let.a,这是完全合法的。
但到了for-of这里,情况就不一样了:下面这种写法是不被允许的:
for (let.b of [1]) ;
不同环境会抛出这样的语法错误:
Firefox提示:Uncaught SyntaxError: an expression X in 'for (X of Y)' must not start with 'let'
Node和Chrome提示:SyntaxError: The left-hand side of a for-of loop may not start with 'let'.
显然,for-of循环肯定存在更多的歧义问题,才导致它的限制比for-in更严格,那这种歧义到底是什么呢?
备注:内容来源于stack exchange,提问作者Vadeen
相关产品推荐
相关产品推荐

