2014-09-02 12 views
5

`मैं पढ़ रहा हूँ 'जावास्क्रिप्ट: यह निश्चित गाइड' और मैं एक उदाहरण पर लटका दिया हो रही है:प्रतिलिपि बनाई जा रही वस्तु संपत्तियों के लिए में पाश

" आप की तरह कोड का उपयोग कर सकते एक सरणी "

var o = {x:1, y:2, z:3}; 
var a = [], i = 0; 
for(a[i++] in o) /* empty */; 

मुझे समझ नहीं आता में सभी वस्तु संपत्तियों के नामों को कॉपी करना निम्नलिखित, क्यों अंतिम पंक्ति वास्तव में कुछ भी करता है, निर्देश के बिना। ऐसा क्यों है सरणी को भरने करता है?

+0

दो टिप्पणी लिखा है? 2) यह कोड जो प्रत्येक रखरखाव तुरंत खिड़की से कूदने का कारण बनता है ... –

+5

क्योंकि 'a [i ++]' 'ओ' की प्रत्येक कुंजी को असाइन किया गया है। आम तौर पर आप एक चर का उपयोग करेंगे, लेकिन इसके बजाय आप ऐरे सदस्यों का उपयोग कर रहे हैं। वही ऑपरेशन –

+0

मैं बस समझना चाहता हूं, यह क्यों काम करता है। मेरे पास इसका उपयोग करने का कोई इरादा नहीं है। ऐसा लगता है जैसे लूप बॉडी खाली है, इसे सरणी भरना नहीं चाहिए, तो यह ऐसा क्यों करता है जो इसे करने का इरादा है? – yxfxmx

उत्तर

3

वाह, मुझे वास्तव में हैरान है कि यह कोड काम करता है! मुझे बस यह कहना है कि मैं इसका उपयोग करने की अनुशंसा नहीं करता हूं और इस प्रकार की a[i++] ट्रिकरी को प्राचीन सी में दिखाने के लिए उम्मीद नहीं करता, जावास्क्रिप्ट में नहीं :)

यह क्यों काम करता है, इसे सिंटैक्स के साथ करना है भाषा। syntax for a for Loop है:

for (LeftHandSideExpression in Expression) Statement 

एक LeftHandSideExpression कुछ भी है कि आप = ऑपरेटर के साथ करने के लिए निर्दिष्ट कर सकते हैं। लूप के लिए, आमतौर पर हम variable identifier का उपयोग for(k in o) में करते हैं, लेकिन arr[i] भी वैध एलएचएस अभिव्यक्ति है (आप arr[i] = कर सकते हैं) हमें for(arr[i] in o) लिखने की भी अनुमति है।

अंत में, अपने पाश

var a=[], i=0; 
a[i++] = "x"; 
a[i++] = "y"; 
a[i++] = "z"; 
// in the end, a should be ["x", "y", "z"] 
// and i should be 3 
+0

यहां जांचें: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/for...in लूप के प्रत्येक पुनरावृत्ति पर एलएचएस अभिव्यक्ति को आरएचएस की एक संपत्ति सौंपी जाती है। इस मामले में यह आपके सरणी का i + 1 तत्व है। तथ्य यह है कि लूप का कोई शरीर नहीं है, जेएस से कोई फर्क नहीं पड़ता है और चूंकि सरणी को लूप के दायरे से बाहर परिभाषित किया जाता है, यह और लूप के पुनरावृत्तियों द्वारा किए गए सभी तत्व उपलब्ध हैं। –

6

इस काम करता है क्योंकि लूप के लिए वैरिएबल को o में मान निर्दिष्ट करता है in के बाएं।

आमतौर पर यह कुछ फ़ंक्शन में उपयोग के लिए एक नया चर होगा। जैसे for(var a in o){/* do something with a */}

इस मामले में यह यह प्रदान करती है में a[i++] के लिए जहां हर बार

1 से i++ बढ़ जाती है यह भी for(a[i++] in o) /* empty */; में ; के महत्व को ओर इशारा करते हुए इस for से प्रत्येक यात्रा बंद कर देता है लायक है। इसके बिना अगली पंक्ति/लूप (जो कुछ भी हो) दोहराया जाएगा।

1

को कुछ इसी तरह कैसे for in loops काम है कि नहीं करता है। आप कुंजी को असाइन करने के संदर्भ के रूप में एक मनमानी बाएं हाथ अभिव्यक्ति निर्दिष्ट कर सकते हैं। आमतौर पर यह एक चर के संदर्भ में है, लेकिन आप a[i++] जैसी संपत्ति अभिव्यक्ति का भी उपयोग कर सकते हैं।

कल्पना से:

  1. ...
  2. lhsRefLeftHandSideExpression (यह मूल्यांकन किया जा सकता है बार बार) के मूल्यांकन का परिणाम हो करते हैं।
  3. PutValue(lhsRef, P) पर कॉल करें।1) यदि यह क्या करता है यह, क्या करने का इरादा है क्यों परेशान:
  4. ...

हो सकता है कि कोड आसान के रूप में

for(a[i] in o) i++; 
संबंधित मुद्दे