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

Javascript 生成器表达式和数组理解中的分解赋值,javascript,Javascript,为什么用于对象中的([])工作正常,但[void 0 for([]in object)]或(void 0 for([]in object))会为无效的左手赋值抛出语法错误吗 例如,我希望下面的代码能够正常工作,但事实并非如此(由于语法错误,断言甚至没有完成): 我在SpiderMonkey的jsparse.c中做了一些深入的研究(我假设这就是您用于1.8特性的JS解析器?) [code for(…in…)格式或使用的是比使用的多的 您的LHS错误是: (jsparse.c第4200行) 当它看到

为什么
用于对象中的([])工作正常,但
[void 0 for([]in object)]
(void 0 for([]in object))
会为无效的左手赋值抛出语法错误吗

例如,我希望下面的代码能够正常工作,但事实并非如此(由于语法错误,断言甚至没有完成):


我在SpiderMonkey的
jsparse.c
中做了一些深入的研究(我假设这就是您用于1.8特性的JS解析器?)

[code for(…in…)
格式或使用的是比使用的多的

您的LHS错误是: (jsparse.c第4200行)

当它看到
[
时,它会找到解构表达式,并确保解析器节点的计数为2

有趣的是,
[void 0 for([a,b]在迭代器中)]
应该可以工作,尽管出于我不想去挖掘的原因,
[a,b]
中的
b
始终是未定义的:

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

参考-标准
For([]in{})
使用以下逻辑确定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维护人员。

我猜他们遇到了不同的语法规则:第一个for不是生成器(这是一份for声明),而后者是。在这种情况下,似乎不支持分解。@Eli:您使用的是什么JS版本和引擎?在理解和生成器中的解构在FF 3.6.2/JS 1.8中适用于我,尽管它阻塞了
let
@outis:哦,很抱歉,我在生成器末尾缺少了一个括号。这是plain JS 1.8+。@Eli:还发生了一些奇怪的事情。我添加了括号,但收到了一条关于
let
关键字的错误消息。同样的事情在Vista和OS X下都会发生。我认为这基本上都归结为语言功能是新的。@Eli:还要注意,断言将失败,因为
gen
将在
for
循环的第一个
中结束。生成器可以倒转吗?我在MDC页面中没有看到任何关于它的内容,但还没有努力找到答案。哇,谢谢你的回答!我将使用
[code for([,]in…)
[code for({}in…)
作为一种解决方法,直到它被修复为止。@Eli Grey-没问题,深入研究SpiderMonkey并了解JS解析器在这个问题上的实际工作方式确实很有趣。:)
js> [[l1,typeof l2] for ([l1,l2] in {a:1, b:2})]
a,undefined,b,undefined
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