生成器表达式和数组理解中的解构赋值

时间:2010-03-25 23:36:12

标签: javascript

为什么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);
}

1 个答案:

答案 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维护者。