为什么for ([] in object);
工作正常,但[void 0 for ([] in object)]
或(void 0 for ([] in object))
会因无效的左手分配而引发语法错误?
例如,我希望以下代码能够正常工作,但事实并非如此(由于语法错误,断言甚至没有完成):
let (
i = 0,
iterable = {__iterator__:function() { var i = 5; while (i--) yield i; } }
) {
for ([] in iterable) i++;
console.assertEquals([void 0 for ([] in iterable)].length, i);
}
答案 0 :(得分:7)
我在SpiderMonkey的jsparse.c
中进行了一些挖掘(我假设你使用的是1.8功能的JS解析器?)
[code for (... in ...)]
格式或generator expression使用different parse function而不是standard for ([] in obj)
使用。
您的LHS错误是created here: (jsparse.c第4200行)
4194 case TOK_LB:
4195 case TOK_LC:
4196 pn3 = DestructuringExpr(cx, &data, tc, tt);
4197 if (!pn3)
4198 return NULL;
4199
4200 if (pn3->pn_type != TOK_RB || pn3->pn_count != 2) {
4201 js_ReportCompileErrorNumber(cx, ts, NULL, JSREPORT_ERROR,
4202 JSMSG_BAD_FOR_LEFTSIDE);
4203 return NULL;
4204 }
当它看到[
它找到解构表达式时,并确保解析器节点的计数为2。
有趣的是[void 0 for ([a,b] in iterator)]
应该有效b
,但由于我不想去挖掘的原因,[a,b]
js> [[l1,typeof l2] for ([l1,l2] in {a:1, b:2})]
a,undefined,b,undefined
始终未定义:
for([] in {})
供参考 - 标准2775 #if JS_HAS_DESTRUCTURING
2776 ((JSVERSION_NUMBER(cx) == JSVERSION_1_7 &&
2777 pn->pn_op == JSOP_FORIN)
2778 ? (pn1->pn_type != TOK_RB || pn1->pn_count != 2)
2779 : (pn1->pn_type != TOK_RB && pn1->pn_type != TOK_RC)) &&
2780 #endif
使用以下逻辑来确定LHS有效性:
{{1}}
这似乎意味着1.7以外的版本不需要2个左手值用于此语法。生成器表达式可能使用较旧的解析逻辑。这可能值得作为报告提交给SpiderMonkey维护者。