为什么(对象中的[]];工作正常,但[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); }
解决方法
我在SpiderMonkey的jsparse.c中进行了一些挖掘(我假设你是用于1.8功能的JS解析器?)
[代码为(… in …)]格式或generator expression使用0700而不是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 }
当它看到[它找到Destructuring Expression时,并确保解析器节点的计数为2.
有趣的是[void 0 for([a,b] in iterator)]应该可以工作,虽然由于我不在乎挖掘的原因,[a,b]中的b总是未定义的:
js> [[l1,typeof l2] for ([l1,l2] in {a:1,b:2})] a,undefined,b,undefined
供参考 – {}中的[[]标准)使用以下逻辑来确定LHS有效性:
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
这似乎意味着1.7以外的版本不需要2个左手值用于此语法.生成器表达式可能使用较旧的解析逻辑.这可能值得作为报告提交给SpiderMonkey维护者.