2015-09-03 7 views
8

तो मूल desctucturing ठीक है, {a, b} = obja = obj.a; b = obj.b के लिए पारदर्शी।क्या बीएसएल का ईएस 6 ऑब्जेक्ट का कार्यान्वयन सही है?

मेरा प्रश्न एक अजीब वाक्य रचना है कि मैं गलती से भर में भाग गया और मैं अगर किसी को कल्पना पर मुझसे बात कर सकते हैं सोच रहा हूँ का एक सा के आसपास है के बाद से मैं यह नहीं मिल सकता है:

({a, b} = obj).c 

कि दो करता है a, b असाइनमेंट और फिर obj.c लौटाता है। यह वास्तव में काफी एक बाइट धारा विकोडक के लिए मेरे लिए उपयोगी है, के रूप में मैं लिख सकते हैं:

let width = ({bytes} = intDecode(bytes)).number; 

मेरे मुद्दा यह है कि मैं कहीं भी इस वाक्य रचना नहीं देखा है और कुछ है जो या तो गलत तरीके से कार्यान्वित पर भरोसा नहीं करना चाहती है या प्रस्ताव चरण में।

+0

यह (के रूप में 'obj = ही है । intDecode (बाइट)) संख्या; बाइट्स = obj.bytes' (शायद मूल्यांकन आदेश को छोड़कर) - ES5 में एक ही विषम वाक्यविन्यास। सुनिश्चित करें कि 'बाइट्स' कहीं घोषित किया गया है। – Bergi

उत्तर

3

असाइनमेंट को नष्ट करने में कुछ भी खास नहीं है: इसका मूल्यांकन = ऑपरेटर के साथ किसी भी अन्य असाइनमेंट के रूप में किया जाता है।

तो यह rval देता है।

जिसका अर्थ है कि आप अपने वाक्यविन्यास पर भरोसा कर सकते हैं।

कुछ विवरण:

Destructuring भाग 6[1] में मूल्यांकन किया जाता है:

status तर्क के रूप में उपयोग करते हुए rvalassignmentPattern की DestructuringAssignmentEvaluation प्रदर्शन करने का परिणाम हो।

और इस आइटम के बाद असाइनमेंट मूल्यांकन आमतौर पर a = b = 42; मामले में होता है।

संदर्भ:

+0

यह तर्कसंगत है कि वास्तव में 'रावल' वास्तव में क्या है। 12.4.4 (1।ए) - 'Rref को AssignmentExpression का मूल्यांकन करने का नतीजा दें।' - मैं तर्क दूंगा कि '({a} = obj)', 'rval === obj.a', _not_' obj' –

+0

@zyklus ऐसा नहीं है, 'रावल' '=' ऑपरेटर के दाएं ऑपरेंड का मूल्य है। '4। रैवल को GetValue (rref) होने दें। ' – zerkms

+1

विनिर्देश के अनुसार' ({a} = obj) 'अभिव्यक्ति' रावल' 'obj' है। 'obj.a' को विनाशकारी असाइनमेंट मूल्यांकन के दौरान देखा जाता है जिसमें पैरामीटर के रूप में 'obj' पास किया गया है। – zerkms

1

हाँ, यह (विवरण के लिए @zerkms 'जवाब देखें) इस तरह काम करने के लिए उम्मीद है। आपने कहीं भी वाक्यविन्यास नहीं देखा है क्योंकि असाइनमेंट अभिव्यक्ति के परिणामस्वरूप गुणों का उपयोग करना बिल्कुल अच्छा अभ्यास नहीं है, क्योंकि यह कोड को काफी पढ़ा जा सकता है। चाहे आप एक सामान्य चर या एक विनाशकारी अभिव्यक्ति को असाइन करते हैं, यहां कोई अंतर नहीं आता है। , और अधिक बारीकी से अपने मूल कोड को

let {bytes, number:width} = intDecode(bytes); 

या वास्तव में:

हालांकि, अगर आप काफी आसानी से कोड एक उचित destructuring काम में बदलना सकता

let width; 
({bytes, number:width} = intDecode(bytes)); 
+0

@ फ़ेलिक्स क्लिंग का हिस्सा है: उन कोष्ठक सिर्फ ओपी के मूल कोड या कुछ और की तरह दिखने के लिए? – zerkms

+2

@zerkms: '{...} = foo' एक वाक्यविन्यास त्रुटि है क्योंकि' {} 'को ब्लॉक के रूप में व्याख्या किया जाता है। पेंटिचेस को पैटर्न के रूप में पार्स किए जाने के लिए उन्हें लागू करने की आवश्यकता है। –

+0

ओह दाएं ....... – zerkms

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