2012-01-09 8 views
8

मुझे jQuery के आर्किटेक्चर के बारे में एक और सवाल मिला। $('div') निर्माण करती है एक नया jQuery वस्तु:jQuery ('div') को सरणी की तरह पूछना क्यों संभव है?

$('div') instanceof jQuery; // true 

मुझे पता है क्यों यह एक सरणी है जैसे कि यह क्वेरी करने के लिए संभव है, allthough यह एक सरणी नहीं है करना चाहते हैं?

$('div')[0]; // returns the first div in the document as a DOM node. 
$.isArray($('div')); // false 

मैं सिर्फ इस वाक्य से प्यार है, यह इतना साफ लग रहा है! मैंने यह भी देखा यह रिटर्न एक सरणी के रूप में डोम नोड्स:

console.log($('div')); 

किसी ने मुझसे यह बताएं कि अपने ही वस्तुओं के लिए इस व्यवहार को लागू करने के कर सकते हैं?


मेरा अपना दृष्टिकोण इस तरह की कुछ तरीकों के साथ एक सरणी बनाने के लिए किया गया था:

var a = ['a', 'b', 'c']; 
a.method = function(){ return 'test'; }; 
a; // ['a', 'b', 'c'] 
a[0]; // 'a' 
a.method(); // 'test' 

हालांकि इस तरह से jQuery यह करता है होना करने के लिए प्रतीत नहीं होता है के रूप में यह वास्तव में एक सरणी है:

$.isArray(a); // true 

मुझे पता है कि कैसे jQuery इस जानने के लिए और अगर यह मेरा की तुलना में एक बेहतर समाधान है देखने के लिए करता है चाहते हैं।

+0

आप का उपयोग '[]' संकेतन का उपयोग कर सकते * किसी * संपत्ति: ये articlea अधिक जानकारी है। सिर्फ सूचकांक नहीं। तो बस '$ ('div') [0] 'की तरह, आप' $ (' div ') [' jquery ']' कर सकते हैं, जो आपको jQuery संस्करण संख्या देगा। –

+0

@amnotiam मुझे पता है कि। लेकिन जब मैं कंसोल में सामान्य वस्तुओं को मुद्रित करता हूं तो वे एक सरणी आउटपुट नहीं करते हैं। –

+0

आह, यदि आप विशेष रूप से कंसोल आउटपुट के बारे में पूछ रहे हैं, तो यह वास्तव में कंसोल है जो आपने इसे दिया है इसके अनुसार सबसे अच्छा अनुमान लगा रहा है। [जे एंडी का जवाब] (http://stackoverflow.com/a/8793090/1106925) दिखाता है कि आम तौर पर कंसोल क्या करता है। –

उत्तर

10

एक jQuery वस्तु क्या हम एक Array-like object कहते हैं। इसका मतलब है, यह वास्तव में एक "सत्य" वस्तु है (वास्तव में, सभी "सरणी" ईसीएमएस्क्रिप्ट में वस्तुएं हैं), लेकिन यह कुछ गुणों का मालिक है जो इसे "सत्य" सरणी की तरह दिखते हैं। उन गुणों एक .length संपत्ति

  • यह .splice() विधि
  • उन दो तथ्यों पर्याप्त है कि ज्यादातर js इंजन शान्ति सरणी के रूप में है कि वस्तु interpretate करेंगे मालिक के रूप में

      यह
    • हैं।

      उदाहरण:

      var myObject = { }, 
          push = Array.prototype.push; 
      
      myObject.aNiceFunction = function() { 
          console.log(this); 
      }; 
      
      push.call(myObject, document.getElementById('foo')); 
      push.call(myObject, document.getElementById('bar')); 
      
      myObject.splice = Array.prototype.splice; 
      

      अगर हम अब लोग इन हमारे वस्तु

      console.log(myObject); 
      

      हम ठेठ jQuery'ish परिणाम

      [div#foo, div#bar] 
      

      See that in action

      मिल

      लेकिन हम अभी भी उस वस्तु पर हमारे विधि .aNiceFunction() कॉल करने के लिए सक्षम हैं। , एकमा स्क्रिप्ट स्वचालित रूप से होगा सूचकांक हमारे लिए उन तत्वों हमारे ऑबजेक्ट पर Array.prototype.push() विधि के साथ नए तत्वों को धक्का द्वारा। JQuery विवरण के तहत क्या होता है यह संक्षिप्त विवरण था।

      "सरणी" एकमा स्क्रिप्ट में के बारे में एक और शब्द। इस भाषा में कोई वास्तविक सरणी नहीं है (यदि हम एक सेकंड के लिए typed arrays भूल जाते हैं)। केवल Object है। हम एक वस्तु है कि Array.prototype से विरासत है, तो हम लगभग यह एक सरणी कहेंगे। हम जो भी करना चाहते थे, वह .length संपत्ति 0 पर सेट करें।

    +2

    जेएस इंजन किसी सरणी के रूप में कुछ भी नहीं समझते हैं। जेएस _users_ चीजों को सरणी के रूप में समझते हैं। :) – SLaks

    +0

    @SLaks: touchè। मेरा मतलब क्या था, उदाहरण के लिए यह कंसोल ऑब्जेक्ट द्वारा "लॉग आउट" है। – jAndy

    +0

    यह फ़ायरबग/क्रोम के सुंदर प्रिंटर (जो जेएस उपयोगकर्ता हैं) का एक फ़ंक्शन है, जेएस इंजन नहीं। – SLaks

    2

    jQuery वस्तुओं सरणी की तरह वस्तुओं रहे हैं।

    एक सरणी जैसी वस्तु एक सामान्य वस्तु है जिसमें एक ही गुण होता है जो एक सरणी करता है।
    वस्तु की तरह एक सरणी एक length संपत्ति एक सकारात्मक पूर्णांक के लिए सेट है, और गुण 0, 1 ... length − 1 नामित सरणी वस्तुओं से युक्त।

    0

    jQuery ऑब्जेक्ट्स "सरणी जैसी" वस्तुएं हैं। नीचे दिए गए कोड पर विचार करें:

    document.forms.length; // returns 1; 
    document.forms[0]; // returns a form element. 
    document.forms.join(", "); // throws a type error. this is not an array. 
    typeof document.forms; // returns "object" 
    

    अपने कोड संशोधित करने के लिए, आप प्राप्त कर सकते थे यह एक ही प्रभावित करते हैं:

    var a = 
    { 
        0: 'a', 
        1: 'b', 
        2: 'c', 
        length: 3, 
        method: function() { 
         return "test"; 
        } 
    }; 
    
    +0

    'console.log (ए) 'ऑब्जेक्ट को सरणी नहीं प्रिंट करता है। तो यह ऐसा नहीं लगता है कि jQuery ऐसा करता है। और जिस तरह से मैं जावास्क्रिप्ट शुरुआती नहीं हूं, मुझे पता है कि जावास्क्रिप्ट ऑब्जेक्ट्स कैसे काम करते हैं। –

    1

    इलाज एक सरणी की तरह एक jQuery वस्तु बतख लिख-लिख कर एक आवेदन है। From Wikipedia:

    ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग भाषाओं के साथ कंप्यूटर प्रोग्रामिंग में, बतख टाइपिंग गतिशील टाइपिंग की एक शैली है, जिसमें एक वस्तु के मौजूदा तरीकों और संपत्तियों की सेट एक से अपनी विरासत से वैध अर्थ विज्ञान निर्धारित करता है, बल्कि है विशिष्ट इंटरफ़ेस का विशेष वर्ग या कार्यान्वयन।

    दूसरे शब्दों में, यह महत्वपूर्ण नहीं है कि jQuery समारोह वास्तव में एक सरणी की तरह कार्य करने के लिए एक सरणी उदाहरण लौटने के लिए, जब तक कि यह आवश्यक गुण (जैसेlength, संख्यात्मक सूचकांक) और तरीकों प्रदान करता है।

    जावास्क्रिप्ट अन्य सरणी की तरह ऑब्जेक्ट्स है। उदाहरण के लिए, arguments वस्तु, एक सरणी नहीं है या तो है, लेकिन यह गुण (length) की तरह है कि आप इसे है नाटक करने के लिए अनुमति देने के है।

    0

    मुझे यकीन है कि क्या यह "सरणी की तरह" पागलपन अन्य उत्तर से है नहीं कर रहा हूँ। "सरणी जैसी" के लिए कोई मानक शब्दावली नहीं है।

    वास्तविक अंतर यहां एक वास्तविक सरणी के बीच का अंतर है, जो एक लिंक्ड सूची बनाम तत्वों का संग्रह है जो संदर्भों का संग्रह है। डीओएम के संदर्भ में एक लिंक्ड सूची को ठीक से नोड सूची के रूप में जाना जाता है।

    http://www.mindcracker.com/Story/1016/interview-question-difference-between-linked-list-and-array.aspx

    http://www.sitepoint.com/a-collection-is-not-an-array/

    http://blog.duruk.net/2011/06/19/nodelists-and-arrays-in-javascript/

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