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

为什么(对象中的[]];工作正常,但[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维护者.

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...