2017-01-20 12 views
5

DOM4 NodeList रों iterable बनाता है:क्या HTMLCollections को ... Symbol (iter.iterator) के साथ पुनरावृत्त किया जा सकता है?

interface NodeList { 
    getter Node ? item (unsigned long index); 
    readonly attribute unsigned long length ; 
    iterable< Node >; 
};

WebIDL के अनुसार, इस का मतलब है

वस्तुओं एक अंतरफलक है कि iterable समर्थन से अधिक दोहराया जा रहा है मूल्यों का एक दृश्य प्राप्त करने के लिए होने के लिए घोषित किया जाता है को लागू करने।

नोट: ECMAScript भाषा में बंधन, एक अंतरफलक है कि है iterable "प्रविष्टियां" होगा, "foreach", "कुंजी", "मूल्यों" और उसके interface prototype object पर @@iterator गुण। ,

for (var el of document.querySelectorAll(selector)) ... 

मैंने देखा एक ही HTMLCollections के लिए काम करने लगता है दोनों फ़ायरफ़ॉक्स और क्रोम पर:

तो निम्नलिखित संभव है

for (var el of document.getElementsByTagName(tag)) ... 

वास्तव में, मैं

मिल
HTMLCollection.prototype[Symbol.iterator] === [][Symbol.iterator]; // true 

हालांकि, HTMLCollection नहीं है iterable के रूप में परिभाषित:

interface HTMLCollection { 
    readonly attribute unsigned long length ; 
    getter Element ? item (unsigned long index); 
    getter Element ? namedItem (DOMString name); 
};

मैं भी WHATWG DOM spec की जाँच की और यह iterable न नहीं है।

फिर, यह व्यवहार मानक है या नहीं? HTMLCollection प्रोटोटाइप में @@iterator होना चाहिए?

+0

http://stackoverflow.com/a/31574921/2813224 – zer00ne

उत्तर

4

मुझे मिल गया है, यह WebIDL में विस्तार से बताया है:

0123: interface निम्न में से कोई है

हैं

तो एक संपत्ति जिसका नाम @@iterator प्रतीक, विशेषताओं के साथ है मौजूद होना चाहिए {[[लिखने योग्य]]: सच, [[गणना]]: झूठी, [[कॉन्फ़िगर करने योग्य]]: सच} और जिसका मान function object है। [...] इंटरफ़ेस एक indexed property getter को परिभाषित करता है

, तो समारोह वस्तु %ArrayProto_values% है।

getter Element ? item (unsigned long index);

और एक पूर्णांक टाइप विशेषता नामित "लंबाई":

इस मामले में, HTMLCollections एक अनुक्रमित संपत्ति गेटर है

readonly attribute unsigned long length ;

इसलिए, हाँ, यह काम चाहिए था । वास्तव में, यह नोडलिस्ट के लिए भी काम करेगा, भले ही उन्हें पुनरावर्तनीय घोषित न किया गया हो, लेकिन तब उनके पास entries, forEach, keys और values गुण नहीं होंगे। जैसा कि @ लोनेसोमेडे का उल्लेख है, यह संभव है कि HTMLCollection को पुन: परिभाषित नहीं किया गया है क्योंकि इन तरीकों को जोड़ने से पीछे की ओर संगत नहीं होगा, इस तथ्य के कारण कि namedItem गेटर मनमाने ढंग से तार स्वीकार करता है।

+0

मैं * अनुमान लगा रहा हूं * यह 'HTMLCollection' या कथन पर 'नामित' विधि के कारण है" नोट: तत्व तत्वों के संग्रह का प्रतिनिधित्व करने के लिए बेहतर समाधान है। HTMLCollection एक ऐतिहासिक आर्टिफैक्ट है जिसे हम छुटकारा नहीं दे सकते वेब का। " – lonesomeday

+2

@lonesomeday हां, ऐसा लगता है, चूंकि नामित इटिम 'एक स्ट्रिंग स्वीकार करता है,' 'EEach' जैसी गुणों को जोड़ना चीजें तोड़ सकता है। – Oriol

0

जावास्क्रिप्ट व्यावहारिक रूप से सब कुछ एक iterable की एक संरचना जैसे कुछ यात्रा इंजन के संचालन के माध्यम से जाना जा सकता है कि में: अगर यह एक गुण है कि यह @@iterator संग्रहीत खिलाफ [[Get]] के संचालन के लिए एक iterator देता for..of और ...spread

कुछ भी iterable है प्रतीक जो उस मामले में स्पष्ट रूप से HTMLCollection ऐसी वस्तु देता है।

एक इटरेटर से प्रति गिना अगर यह एक है: next() {method}:, और दो अन्य वैकल्पिक तरीके के रूप में अच्छी तरह से कर रहे हैं कि

return() {method}: stops iterator and returns IteratorResult 
throw() {method}: signals error and returns IteratorResult 

यह है कि iterable है एक पूरा कस्टम वस्तु का एक उदाहरण है।

const calculations = { 
     counting: 1, 
     [Symbol.iterator]: function(){ return this; }, 
     next: function(){ 

     if(this.counting <= 3){ 

      return { 
      value: this.counting++, 
      done: false 
      } 
     } 

     return { value: this.counting, done: true} 
     } 
    }; 

const data = ...calculations; // [1,2,3] 
अपने मामले में

तो, जब तक HTMLCollection एक उचित iterator देता है के रूप में आप for..of और ...spread, आवेदन कर सकते हैं, लेकिन यदि आप चिंता मौसम इस विनिर्देश को पूरा करती है की तुलना में मैं आपको बताना है कि मैं एक नहीं है है स्नातक अभी तक कंप्यूटर विज्ञान की डिग्री: पी

+0

धन्यवाद, मैं पहले से ही 'बारे में @@ iterator', मेरी चिंता का विषय HTMLCollection' एक उचित इटरेटर – Oriol

+0

@Oriol वापस जाने के लिए मैं इस पर निर्भर करता है लगता है माना जाता है कि क्या' है पता था कार्यान्वयन पर। एचटीएमएल कोलेक्शन इंटरफेस में इटेटरेटर के लिए कोई घोषणा नहीं है लेकिन जब कार्यान्वित किया जाता है तो आप एक और इंटरफ़ेस भी शामिल कर सकते हैं। इस मामले में HTMLCollection और NodeList संग्रहों का एक प्रतिनिधित्व है जो पर्याप्त रूप से पर्याप्त है। – Burimi

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