微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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维护者.

原文地址:https://www.jb51.cc/js/158720.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐