javascript – 生成器表达式和数组解析中的解构赋值

前端之家收集整理的这篇文章主要介绍了javascript – 生成器表达式和数组解析中的解构赋值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么(对象中的[]];工作正常,但[void 0 for([] in object)]或(void 0 for([] in object))抛出无效左手赋值的语法错误

例如,我希望以下代码可以工作,但它没有(由于语法错误,甚至没有完成断言):

  1. let (
  2. i = 0,iterable = {__iterator__:function() { var i = 5; while (i--) yield i; } }
  3. ) {
  4. for ([] in iterable) i++;
  5. console.assertEquals([void 0 for ([] in iterable)].length,i);
  6. }

解决方法

我在SpiderMonkey的jsparse.c中进行了一些挖掘(我假设你是用于1.8功能的JS解析器?)

[代码为(… in …)]格式或generator expression使用0700而不是standard for ([] in obj)使用.

您的LHS错误created here
(jsparse.c第4200行)

  1. 4194 case TOK_LB:
  2. 4195 case TOK_LC:
  3. 4196 pn3 = DestructuringExpr(cx,&data,tc,tt);
  4. 4197 if (!pn3)
  5. 4198 return NULL;
  6. 4199
  7. 4200 if (pn3->pn_type != TOK_RB || pn3->pn_count != 2) {
  8. 4201 js_ReportCompileErrorNumber(cx,ts,NULL,JSREPORT_ERROR,4202 JSMSG_BAD_FOR_LEFTSIDE);
  9. 4203 return NULL;
  10. 4204 }

当它看到[它找到Destructuring Expression时,并确保解析器节点的计数为2.

有趣的是[void 0 for([a,b] in iterator)]应该可以工作,虽然由于我不在乎挖掘的原因,[a,b]中的b总是未定义的:

  1. js> [[l1,typeof l2] for ([l1,l2] in {a:1,b:2})]
  2. a,undefined,b,undefined

供参考 – {}中的[[]标准)使用以下逻辑来确定LHS有效性:

  1. 2775 #if JS_HAS_DESTRUCTURING
  2. 2776 ((JSVERSION_NUMBER(cx) == JSVERSION_1_7 &&
  3. 2777 pn->pn_op == JSOP_FORIN)
  4. 2778 ? (pn1->pn_type != TOK_RB || pn1->pn_count != 2)
  5. 2779 : (pn1->pn_type != TOK_RB && pn1->pn_type != TOK_RC)) &&
  6. 2780 #endif

这似乎意味着1.7以外的版本不需要2个左手值用于此语法.生成器表达式可能使用较旧的解析逻辑.这可能值得作为报告提交给SpiderMonkey维护者.

猜你在找的JavaScript相关文章