मैं jsparse.c
में एक छोटे से खुदाई किया Spidermonkey (जो मुझे लगता है जे एस पार्सर आप 1.8 सुविधाओं के लिए उपयोग कर रहे है?) की
[code for (... in ...)]
प्रारूप या generator expressionstandard for ([] in obj)
का उपयोग करता है की तुलना में एक different parse function उपयोग करता है।
आपका एलएचएस त्रुटि किया जा रहा है 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 अभिव्यक्ति पाता है देखता है, और पार्सर नोड की गिनती सुनिश्चित करता है 2.
पर है
दिलचस्प बात यह [void 0 for ([a,b] in iterator)]
, काम करना चाहिए, हालांकि कारणों के लिए मैं के लिए खुदाई जाना परवाह नहीं है, b
[a,b]
से हमेशा अपरिभाषित है:
-
js> [[l1,typeof l2] for ([l1,l2] in {a:1, b:2})]
a,undefined,b,undefined
संदर्भ के लिए मानक for([] in {})
एलएचएस वैधता निर्धारित करने के लिए निम्न तर्क का उपयोग करता:
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 बाएं हाथ मूल्यों की आवश्यकता नहीं है लगता है । जनरेटर अभिव्यक्ति पुराने पार्सिंग तर्क का उपयोग कर सकती है। यह स्पाइडरमोन्की रखरखावकर्ताओं को एक रिपोर्ट के रूप में सबमिट करने लायक हो सकता है।
मेरा अनुमान है कि उन्होंने विभिन्न व्याकरण नियमों को मारा: पहला जनरेटर नहीं है (यह एक कथन है), जबकि उत्तरार्द्ध है। ऐसा नहीं लगता है कि उस स्थिति में अपघटन समर्थित है। –
@Eli: आप किस जेएस संस्करण और इंजन के साथ काम कर रहे हैं? समझ और जनरेटर में विनाश एफएफ 3.6.2/जेएस 1.8 में मेरे लिए काम करता है। हालांकि, यह 'चलो' पर चोक करता है। – outis
@outis: ओह क्षमा करें मैं उस जनरेटर के अंत में एक कोष्ठक खो रहा था। यह सादा जेएस 1.8+ है। –