2010-03-25 11 views
7

for ([] in object); ठीक काम क्यों करता है लेकिन [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); 
} 
+1

मेरा अनुमान है कि उन्होंने विभिन्न व्याकरण नियमों को मारा: पहला जनरेटर नहीं है (यह एक कथन है), जबकि उत्तरार्द्ध है। ऐसा नहीं लगता है कि उस स्थिति में अपघटन समर्थित है। –

+1

@Eli: आप किस जेएस संस्करण और इंजन के साथ काम कर रहे हैं? समझ और जनरेटर में विनाश एफएफ 3.6.2/जेएस 1.8 में मेरे लिए काम करता है। हालांकि, यह 'चलो' पर चोक करता है। – outis

+0

@outis: ओह क्षमा करें मैं उस जनरेटर के अंत में एक कोष्ठक खो रहा था। यह सादा जेएस 1.8+ है। –

उत्तर

7

मैं 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 बाएं हाथ मूल्यों की आवश्यकता नहीं है लगता है । जनरेटर अभिव्यक्ति पुराने पार्सिंग तर्क का उपयोग कर सकती है। यह स्पाइडरमोन्की रखरखावकर्ताओं को एक रिपोर्ट के रूप में सबमिट करने लायक हो सकता है।

+0

वाह, महान उत्तर के लिए धन्यवाद! मैं या तो [कोड के लिए कोड ([,] में ...)] या '[कोड के लिए ({} में ...)] का उपयोग करने जा रहा हूं, जब तक यह तय नहीं हो जाता है। –

+1

@ एली ग्रे - कोई समस्या नहीं, स्पाइडरमोन्की में खोदना वास्तव में बहुत मजेदार था और सीखें कि जेएस पार्सर वास्तव में इस पर कैसे काम करता है। :) – gnarf

संबंधित मुद्दे