2013-07-26 5 views
8

मुझे जिज्ञासा से कोई प्रश्न है। इसलिए मैंने देखा कि जेएस परिवर्तनीय असाइनमेंट कैसे संभालता है और मुझे यह मिल जाता है। How does variable assignment work in JavaScript?ऑब्जेक्ट पॉइंटर्स के रूप में जावास्क्रिप्ट वैरिएबल

लेकिन इसी सिद्धांत निम्नलिखित कोड मैं पर काम कर रहा हूँ में ही प्रदर्शन करने के लिए प्रतीत नहीं होता:

var temp = playlist1[0]; 
playlist1[0] = playlist1[1]; 
playlist1[1] = temp; 

मैं जानता हूँ कि इस सरणी तत्वों स्वैप करने के लिए एक मानक तरीका है। लेकिन अगर temp playlist1[0] पर इंगित कर रहा है, और playlist1[0] की सामग्री playlist1[1] पर बदल दी गई है तो मैं पंक्ति में दो playlist1[1] मानों के साथ कैसे समाप्त नहीं हो सकता?

+0

संभावित डुप्लिकेट [जावास्क्रिप्ट में परिवर्तनीय असाइनमेंट कैसे काम करता है?] (Http: // stackoverflow।कॉम/प्रश्न/509579/कैसे-करता-चर-असाइनमेंट-वर्क-इन-जावास्क्रिप्ट) –

+0

मैंने इसे डुप्लिकेट के रूप में वोट दिया क्योंकि आपके द्वारा लिंक किए गए प्रश्न का उत्तर आपके प्रश्न का उत्तर है। –

+0

@EvanTrimboli मुझे लगता है कि सवाल उचित है क्योंकि यह मौजूदा प्रश्न पर और स्पष्टीकरण मांगता है। दूसरा सवाल पुराना है और शायद अब निगरानी नहीं की जा रही है। – TGH

उत्तर

11

न केवल चर ऑब्जेक्ट पॉइंटर्स हैं। सभी मान (जो प्राइमेटिव नहीं हैं) ऑब्जेक्ट पॉइंटर्स हैं। तो temp एक ऑब्जेक्ट पॉइंटर है। playlist1 एक ऑब्जेक्ट पॉइंटर है जो एक सरणी ऑब्जेक्ट है जिसका तत्व ऑब्जेक्ट पॉइंटर्स हैं। जैसे playlist1[0] एक वस्तु सूचक है, playlist1[1] एक वस्तु सूचक, आदि

है लेकिन अगर अस्थायी playlist1 पर इशारा कर रही है [0]

यह मतलब नहीं है। temp एक ऑब्जेक्ट पॉइंटर है। यह एक वस्तु को इंगित करता है। playlist1[0] एक वस्तु नहीं है; यह एक ऑब्जेक्ट पॉइंटर है। temp = playlist1[0]; ऑब्जेक्ट पॉइंटर temp ऑब्जेक्ट पॉइंटर playlist1[0] के समान ऑब्जेक्ट को इंगित करता है।

आप सी पता है, यह कुछ इस तरह के बराबर है:

Object *playlist1[10]; 

Object *temp = playlist1[0]; 
playlist1[0] = playlist1[1]; 
playlist1[1] = temp; 
+1

ओपी का टेकवे: सरणी तत्व वस्तुएं नहीं हैं, वे भी ऑब्जेक्ट्स के पॉइंटर्स हैं। इसने मेरे प्रश्न का उत्तर दिया और तंत्र की मेरी समझ को गहरा कर दिया। – nemo

2

यह संदर्भित प्रश्न में उत्तर के साथ संगत है: आप केवल वेरिएबल पॉइंट्स को ऑब्जेक्ट कर रहे हैं - डेटा को इंगित करने के लिए उपयोग नहीं किया जाता है। मतलब temp playlist1 [1] प्लेलिस्ट 1 [2] पर जाने के लिए कदम से अप्रभावित है। Temp मूल मान को बरकरार रखता है जब यह playlis1 [1] और temp दोनों ने इंगित किया। केवल प्लेलिस्ट 1 [1]

0

अपडेट किया गया है क्योंकि वे अभी भी सरणी में तत्वों के संदर्भ हैं और तत्व स्वयं नहीं हैं। तो लाइन में:

playlist[1]=playlist[2] 

आप अस्थायी के बारे में कुछ भी नहीं बदल रहे हैं। कंट्रास्ट ऐसा ही कुछ के साथ (यह मानते हुए सरणी तत्वों वस्तुओं थे):

playlist[1].x=playlist[2].x 

कि वास्तव में सरणी में वस्तु का मान निर्दिष्ट है, और अस्थायी [1], तो temp.x होगा बराबर प्लेलिस्ट प्लेलिस्ट की ओर इशारा किया है, तो [2] .x

0

कहते हैं कि हम obj={l1:{l2:[1,2]},} है और हम तो arr=["l1","l2",1] तरह स्तरों की एक सरणी का उपयोग कर obj.l1.l2[1] पता करने के लिए करना चाहते हैं:

Object.defineProperty(Object.prototype,'point',{ 
    value:function(arr){ 
     var rez=this; 
     for(var s in arr){ 
      rez=rez[arr[s]]; 
      if(rez === undefined) return undefined; 
     } 
     return rez; 
    } 
}); 

तो "पॉइंट" विधि को परिभाषित करने के बाद (जो कि गड़बड़ी करने के लिए गड़बड़ नहीं है) हम

obj.point(arr) 
का उपयोग कर सकते हैं

मूल्य 2

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